Python Pandas基于来自另一个数据帧的多个列返回一个数据帧的列
我一直在寻找这个问题的答案,但我甚至不知道如何用一种近似结果的方式来描述它 情况: 我想在df中引入值列并将它们合并到df2中,但我需要根据它是否返回值合并多个列。今天的过程是查看是否通过连接高、中、低列来返回值,顺序取决于是否返回值。如果某些高值没有返回结果,则只在中间列上进行连接,如果仍然没有匹配项,则对低列执行相同的过程。我正在研究groupby方法,但不知道这是否是实现我目标的最佳方法 以下是一个基本示例:Python Pandas基于来自另一个数据帧的多个列返回一个数据帧的列,python,pandas,Python,Pandas,我一直在寻找这个问题的答案,但我甚至不知道如何用一种近似结果的方式来描述它 情况: 我想在df中引入值列并将它们合并到df2中,但我需要根据它是否返回值合并多个列。今天的过程是查看是否通过连接高、中、低列来返回值,顺序取决于是否返回值。如果某些高值没有返回结果,则只在中间列上进行连接,如果仍然没有匹配项,则对低列执行相同的过程。我正在研究groupby方法,但不知道这是否是实现我目标的最佳方法 以下是一个基本示例: df = pd.DataFrame({ 'LOW' : ['Abc', 'Bcd
df = pd.DataFrame({ 'LOW' : ['Abc', 'Bcd', 'CdE'], 'MID' : ['aBc', 'bCd', 'cDe'], 'HIGH': ['abC', 'bcD', 'cdE'], 'VALUE1': ['1','2','3'], 'VALUE2': ['bb','dd','ee']})
df
+----+-------+------+------+---------+--------+
| | HIGH | LOW | MID | VALUE1 | VALUE2 |
+----+-------+------+------+---------+--------+
| 0 | abC | Abc | aBc | 1 | bb |
| 1 | bcD | Bcd | bCd | 2 | dd |
| 2 | cdE | CdE | cDe | 3 | ee |
+----+-------+------+------+---------+--------+
df2 = pd.DataFrame({ 'LOW' : ['Abc-4', 'Bcd-1', 'CdE'], 'MID' : ['aBc*2', 'bCd', 'cDe&3'], 'HIGH': ['abC', 'bcD$22', 'cdE#2']})
df2
+----+---------+--------+-------+
| | HIGH | LOW | MID |
+----+---------+--------+-------+
| 0 | abC | Abc-4 | aBc*2 |
| 1 | bcD$22 | Bcd-1 | bCd |
| 2 | cdE#2 | CdE | cDe&3 |
+----+---------+--------+-------+
df_result
+----+---------+--------+--------+--------+--------+
| | HIGH | LOW | MID | VALUE | VALUE2 |
+----+---------+--------+--------+--------+--------+
| 0 | abC | Abc-4 | aBc*2 | 1 | bb |
| 1 | bcD$22 | Bcd-1 | bCd | 2 | dd |
| 2 | cdE#2 | CdE | cDe&3 | 3 | ee |
+----+---------+--------+--------+--------+--------+
谢谢大家! 这就是你想要的吗
import numpy
import pandas as pd
df = pd.DataFrame({ 'LOW' : ['Abc', 'Bcd', 'CdE'], 'MID' : ['aBc', 'bCd', 'cDe'], 'HIGH': ['abC', 'bcD', 'cdE'], 'VALUE1': ['1','2','3'], 'VALUE2': ['bb','dd','ee']})
df1=df.drop(['VALUE1','VALUE2'],axis=1)
df2 = pd.DataFrame({ 'LOW' : ['Abc-4', 'Bcd-1', 'CdE'], 'MID' : ['aBc*2', 'bCd23', 'cDe&3'], 'HIGH': ['abC', 'bcD$22', 'cdE#2']})
rowsum=numpy.sum((df1==df2).astype(int),axis=1)
df_result=df2
df_result['VALUE1']=df.VALUE1*rowsum
df_result['VALUE2']=df.VALUE2*rowsum
df_result
Out[4]:
HIGH LOW MID VALUE1 VALUE2
0 abC Abc-4 aBc*2 1 bb
1 bcD$22 Bcd-1 bCd23
2 cdE#2 CdE cDe&3 3 ee
一个更好的例子可能会有所帮助,但如果我正确地遵循了以下步骤,那么以下方法会起作用:
df3 = pd.merge(df2, df, on='HIGH', how='inner', suffixes=['', 'r'])
df4 = pd.merge(df2, df, on='MID', how='inner', suffixes=['', 'r'])
df5 = pd.merge(df2, df, on='LOW', how='inner', suffixes=['', 'r'])
df6 = pd.concat([df3, df4, df5]).drop(['HIGHr', 'MIDr', 'LOWr'], axis=1)
df6
HIGH LOW MID VALUE1 VALUE2
0 abC Abc-4 aBc*2 1 bb
1 bcD$22 Bcd-1 bCd 2 dd
2 cdE#2 CdE cDe&3 3 ee
我认为唯一的方法是先在高处合并,检查nan,如果nan出现,然后再合并到下一个,依此类推。我最终同意了这个建议。下面的答案适用于我的简单示例,但不适用于我的实际用例。