通过查找多个列值进行合并
Posted
技术标签:
【中文标题】通过查找多个列值进行合并【英文标题】:Merge by looking up multiple column values 【发布时间】:2021-06-22 20:15:50 【问题描述】:我在 pandas 中有以下 2 个数据框形式的表;
这是所有可能组合的列表:
Table A:
0 1 2
+---+----+----+
0| A |None|None|
+---+----+----+
1| B |None|None|
+---+----+----+
2|...| | |
+---+----+----+
3| A | C | D |
+---+----+----+
4| B | C | D |
+---+----+----+
这些是变量的相关值:
Table B:
0 1
+---+---+
0| A | 5 |
+---+---+
1| B | 2 |
+---+---+
2| C | 7 |
+---+---+
3| D | 4 |
+---+---+
我需要的是这样的:
0 1 2 3
+---+----+----+---+
0| A |None|None| 5 |
+---+----+----+---+
1| B |None|None| 2 |
+---+----+----+---+
2|...| | | |
+---+----+----+---+
3| A | C | D | 7 |
+---+----+----+---+
4| B | C | D | 7 |
+---+----+----+---+
通过在 Table A
、0
、1
和 2
中的 Table B
、0
列中查找每个关联值并返回这些值中的最大值,可以找到第 3 列。
例如:
第 3 行显示了 A
、C
和 D
的组合。因此列3
在Table B
中查找A
,值为5
,然后在Table B
中查找C
,值为7
。最后它在Table B
中查找D
,其值为4
。在这 3 个数字中,7 是最大的,所以它返回。
到目前为止我尝试过pandas.merge
,但没有成功
更新: 我试过这个:
Final=df1.insert(3,column='min space',value=df1.join(df2.set_index(0),on=0).max())
但它只返回 None
并且不考虑 df1 中的多个列,如果我尝试添加多个列;[0,1,2]
它告诉我每个列需要相同数量的列
【问题讨论】:
【参考方案1】:您可以将所有单元格转换为数字(通过关联的df),然后获取每行最大值的列。
import pandas as pd
df = pd.DataFrame( # original df
0:['A', 'B', 'A', 'B',],
1:[None, None, 'C', 'C',],
2:[None, None, 'D', 'D',],
)
rdf = pd.DataFrame( # associated values
0:['A', 'B', 'C', 'D',],
1:[5, 2, 7, 4,],
)
tdf = df # copy the original df
rdf = rdf.set_index(0)[1] # set index of rdf for next line
tdf = tdf[tdf.columns].replace(rdf) # replace all values in tdf by rdf
tdf[3] = tdf.max(axis=1) # column[3] = max of each row
df[3] = tdf[3] # add column[3] to original df
print(df)
0 1 2 3
0 A None None 5.0
1 B None None 2.0
2 A C D 7.0
3 B C D 7.0
【讨论】:
【参考方案2】:df1[3] = df2.merge(
df1.stack(dropna=False).reset_index(0), how='outer'
).groupby('level_0').max()
例子:
>>> df1
0 1 2
0 A NaN NaN
1 B NaN NaN
2 ... NaN NaN
3 A C D
4 B C D
>>> df2
0 1
0 A 5
1 B 2
2 C 7
3 D 4
>>> df1.columns
Int64Index([0, 1, 2], dtype='int64')
>>> df2.columns
Int64Index([0, 1], dtype='int64')
>>> df2[1].dtype
dtype('int64')
df1[3] = df2.merge(
df1.stack(dropna=False).reset_index(0), how='outer'
).groupby('level_0').max()
>>> df1
0 1 2 3
0 A NaN NaN 5.0
1 B NaN NaN 2.0
2 ... NaN NaN NaN
3 A C D 7.0
4 B C D 7.0
【讨论】:
这会引发错误;mergeError: No common columns to perform merge on. Merge options: left_on=None, right_on=None, left_index=False, right_index=False
我添加了一个例子来展示它的工作原理。与您的示例 - 它应该自动合并 0
列。【参考方案3】:
试试replace
dfA['out'] = dfA.replace(dict(zip(dfB[0],dfB[1]))).max(1)
dfA
Out[487]:
0 1 2 out
0 A None None 5.0
1 B None None 2.0
2 A C D 7.0
3 B C D 7.0
【讨论】:
我需要在表格中保留字母 ID。【参考方案4】:试试这个..
#!/usr/bin/env python3
import pandas as pd
A, B, C, D = 5, 2, 7, 4
df = pd.DataFrame(
0: [A, B, None, A, B],
1: [None, None, None, C, C],
2: [None, None, None, D, D]
)
df[3] = df.max(axis=1)
输出:
0 1 2 3
0 5.0 NaN NaN 5.0
1 2.0 NaN NaN 2.0
2 NaN NaN NaN NaN
3 5.0 7.0 4.0 7.0
4 2.0 7.0 4.0 7.0
【讨论】:
以上是关于通过查找多个列值进行合并的主要内容,如果未能解决你的问题,请参考以下文章