在 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 的列表中,我想合并列col1col3 上的两个数据框。

预期结果是

>>> 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']]) 来查找字典,然后我将 dfs 合并回来以获得我需要的内容。

以上是关于在 id 和值列表之间在 Pandas 中进行复杂连接的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章

添加以不同标签显示的列表框项目和值(在不同表单之间)

pandas使用groupby函数基于指定分组变量对dataframe数据进行分组使用sum函数计算所有分组中指定数值变量的聚合加和值即字段在指定分组的加和值([]方括号指定需要计算的数值字段)

pandas使用groupby函数基于指定分组变量对dataframe数据进行分组使用sum函数计算每个分组中的所有数值变量的聚合加和值

在 Pandas 中结合日期数据框和值数据框

html属性和值之间的空格?

在 Pandas 数据框的多索引数据中按索引和值排序