pandas - 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:
解决方案
将它们合并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
推荐阅读
- ios - 如何在 Swift 中延迟几秒钟
- python - 自注意力层的应用引发索引错误
- python - 通过比较值而不是列名来合并两个数据框
- javascript - 无法读取未定义的属性“更新”
- javascript - 如何在 setInterval 刷新时删除地图标记(js)
- kql - KQL 登录日志
- c# - 在 C# .NET Core 中附加到响应正文
- flutter - 在同一个 DartVM 中,有没有可能会有一个 Class。哈希码冲突
- c++ - 什么数据会被缓存?
- javascript - 从播放列表中删除项目时 Spotify Web API 错误 400“缺少曲目” - Pizzly