首页 > 解决方案 > 使用 pandas 从 2 列中提取现有和不存在的值

问题描述

我是 pandas 的新手,我正在尝试获取两列中存在的值列表、A 列中存在的值、B 列中仅存在的值。

我的 .csv 文件如下所示:

A        B
AAA      ZZZ
BBB      BBB
CCC      EEE
DDD      FFF
EEE      AAA
         DDD
GGG      HHH
JJJ

列的长度不同,我的结果将是 3 个列表或一个 csv,我将输出 3 个列,一个用于两个列中存在的项目,一个用于仅存在于 A 列中的项目,一个用于仅存在于 B 列中的项目。

IN BOTH      IN COLUMN A     IN COLUMN B
AAA          CCC             ZZZ
BBB          GGG             FFF
DDD          JJJ             HHH
EEE
(empty one)

我曾尝试使用 .isin() 模块,但它返回 true 或 false 而不是实际列表。

existing_in_both = df_column_a.isin(df_column_b)

而且我不知道应该如何尝试提取仅存在于 A 列或 B 列中的值。

谢谢你的建议。

我的实际 .csv 具有以下内容:

id clickout_id timestamp click_id click_type
1 123abc       2019-11-25 c51c56d1 1
1 123dce       2019-11-25 c51c5fs1 12

和其他文件看起来像这样:

timestamp id gid type
2019-11-25 1 c51c56d1 2
2019-11-25 1 c51c5fs1 2

我正在尝试比较第一个文件中的 click_id 和第二个文件中的 gid 。

当我使用您的答案打印出来时,我将标题名称作为答案而不是列中的值。

标签: pythonpandascsv

解决方案


使用sets 与交集和差异,然后为 newDataFrame使用Series,因为输出的长度不同:

a = set(df.A)
b = set(df.B)

df = pd.DataFrame({'IN BOTH': pd.Series(list(a & b)),
                   'IN COLUMN A': pd.Series(list(a - b)),
                   'IN COLUMN B': pd.Series(list(b - a))})
print (df)
  IN BOTH IN COLUMN A IN COLUMN B
0     DDD         CCC         FFF
1     BBB         GGG         ZZZ
2     AAA         JJJ         HHH
3                 NaN         NaN
4     EEE         NaN         NaN

numpy.intersect1d使用numpy.setdiff1d

df = pd.DataFrame({'IN BOTH': pd.Series(np.intersect1d(df.A, df.B)),
                   'IN COLUMN A': pd.Series(np.setdiff1d(df.A, df.B)),
                   'IN COLUMN B': pd.Series(np.setdiff1d(df.B, df.A))})
print (df)
  IN BOTH IN COLUMN A IN COLUMN B
0                 CCC         FFF
1     AAA         GGG         HHH
2     BBB         JJJ         ZZZ
3     DDD         NaN         NaN
4     EEE         NaN         NaN

推荐阅读