熊猫:根据较小数据框中的信息,对巨型数据框的每一行中的匹配值进行计数

时间:2018-09-17 19:52:29

标签: pandas dataframe

我有一个大型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:

1 个答案:

答案 0 :(得分:2)

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