首页 > 解决方案 > Pandas:根据来自较小数据帧的信息计算巨型数据帧每一行中的匹配值

问题描述

我有一个大的 df 格式如下:

df1 = 
ID    char
r1    foo
r2    foo
r5    bar
r9    bar
...   ...

另一个更大的格式如下:

df2 = 
ID    a12   b23    c81   ...
r1    foo   baz    bar   ...
r2    foo   foo    bar   ...
r3    bar   bar    baz   ...
r4    bar   baz    bar   ...
...   ...   ...    ...

查看两个 df 中的 ID 行,我想收集其余列匹配的数量。所以对于 ID r1,我查看 df2 中的那一行,只看到a12匹配项。我想跟踪每场比赛,所以对于第一行我有

a12    1
b23    0
c81    0

df2 中的某些行在 df1 中没有行(df2 有r4行而 df1 没有)。此示例的总数为:

a12    2
b23    1
c81    0

df1 是一个可以加载到内存中的 .csv,但 df2 太大了,我将其加载到块中。因此,要比较两者,我会将它们都加载进去,然后必须从以下内容开始:

df1 = pd.read_csv("C:\\Users\\me\\df1.csv")
df2 = pd.read_table("C:\\Users\\me\\df2.vcf.gz", header = None, names = header_line, engine = 'c',
                       compression = 'gzip', chunksize = 40000, low_memory=False)

for chunk in df2:

标签: pandasdataframe

解决方案


将它们合并DataFrames在一起,然后用于.eq查看哪些列等于该'char'列。

s = pd.Series()
for chunk in df2:
    merged = df1.merge(chunk, on='ID')
    s = s.add(merged[[col for col in chunk.columns if col != 'ID']].eq(merged.char, axis=0).sum(), 
              fill_value=0)

输出:s

a12    2.0
b23    1.0
c81    0.0
dtype: float64

推荐阅读