在 id 和值列表之间在 Pandas 中进行复杂连接的最佳方法
Posted
技术标签:
【中文标题】在 id 和值列表之间在 Pandas 中进行复杂连接的最佳方法【英文标题】:Best way to do a complex join in Pandas between an id and and list of values 【发布时间】:2019-07-19 12:04:43 【问题描述】:假设我有两个数据框:
a = 'col1': ['value_1'], 'col2': ['value_4']
df_a = pd.DataFramed = pd.DataFrame(data=a)
b = 'col3': [['value_1', 'value_2']], 'col4': ['value_6']
df_b = pd.DataFramed = pd.DataFrame(data=b)
如果col1
中的值在col3
的列表中,我想合并列col1
和col3
上的两个数据框。
预期结果是
>>> df_merged
col1 col2 col3 col4
0 value_1 value_4 ['value_1', 'value_2'] 'value_6'
我可以通过按值获取列表来解构列表:
ids = df_b.iloc[0]['col3']]
然后我可以遍历列表,并将列表值插入到 df_b 等中的新列中,然后我继续进行多次合并等,但这很丑陋,而且看起来很随意.
因此,我正在寻找一种干净且“pythonic”(读作优雅和通用)的合并方式。
【问题讨论】:
您的预期结果是什么? 请参阅上面的编辑 【参考方案1】:我以使用unnesting 方法结束你的df_b,然后做merge
s=unnesting(df_b,['col3']).reset_index()
newdf=df_a.merge(s[['col3','index']],left_on='col1',right_on='col3',how='left').drop('col3',1)
newdf.merge(df_b,left_on='index',right_index=True,how='left')
col1 col2 index col3 col4
0 value_1 value_4 0 [value_1, value_2] value_6
【讨论】:
看起来很有希望。我在idx=df.index.repeat(df[explode[0]].str.len())
行上收到count < 0
错误,因为我认为这是因为该列的某些值是NaN
。我会先尝试过滤掉它们,因为它们不是必需的。
天哪!它有效(当然,col3
的值实际上是字典,所以我仍然需要从中获取值,但这是巨大的帮助!)!
工作就像一个魅力:我能够从中提取价值。通过使用此列表理解 df1 = pd.DataFrame([x for x in s['col3']])
来查找字典,然后我将 df
与 s
合并回来以获得我需要的内容。以上是关于在 id 和值列表之间在 Pandas 中进行复杂连接的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章
pandas使用groupby函数基于指定分组变量对dataframe数据进行分组使用sum函数计算所有分组中指定数值变量的聚合加和值即字段在指定分组的加和值([]方括号指定需要计算的数值字段)
pandas使用groupby函数基于指定分组变量对dataframe数据进行分组使用sum函数计算每个分组中的所有数值变量的聚合加和值