我在合并列重叠的 Pandas 中的 2 个不同大小的 DataFrame 时遇到了一些问题。
df1 =
+-------+--------+--------+-------+
| value | method | number | price |
+-------+--------+--------+-------+
| 0.5 | add | 489245 | 600 |
| 0.7 | add | 489245 | NaN |
| 0.7 | mul | 584682 | 225 |
| 0.9 | mul | 624602 | NaN |
| 0.95 | mul | 624602 | NaN |
| 0.99 | mul | 624602 | NaN |
| NaN | NaN | 900000 | 300 |
| NaN | add | 900000 | NaN |
+-------+--------+--------+-------+
df2 =
+--------+-------+-----+-----+
| number | price | loc | get |
+--------+-------+-----+-----+
| 489245 | 200 | aa | up |
| 584682 | NaN | ab | NaN |
| 624602 | NaN | bb | NaN |
| 900000 | NaN | cc | dn |
+--------+-------+-----+-----+
我期望的结果:
+-------+--------+--------+-------+-----+-----+
| value | method | number | price | loc | get |
+-------+--------+--------+-------+-----+-----+
| 0.5 | add | 489245 | 200 | aa | up |
| 0.7 | add | 489245 | 200 | aa | up |
| 0.7 | mul | 584682 | 225 | ab | NaN |
| 0.9 | mul | 624602 | NaN | bb | NaN |
| 0.95 | mul | 624602 | NaN | bb | NaN |
| 0.99 | mul | 624602 | NaN | bb | NaN |
| NaN | NaN | 900000 | 300 | cc | dn |
| NaN | add | 900000 | NaN | cc | dn |
+-------+--------+--------+-------+-----+-----+
例如,要加入的列 = 'number'。如果 df1 和 df2 在重叠列(如“价格”)上都具有非 NaN 值,则 df2 将更可取。否则,应该写一个非 NaN 的。
最佳答案
总结:merge
,然后是一些 DataFrame 操作,然后是 update
。
首先加载数据(包含在此处以供引用)。
In [1]: import pandas
In [2]: df1 = pandas.read_csv('df1.csv')
In [3]: df2 = pandas.read_csv('df2.csv')
In [4]: df1
Out[4]:
value method number price
0 0.50 add 489245 600
1 0.70 add 489245 NaN
2 0.70 mul 584682 225
3 0.90 mul 624602 NaN
4 0.95 mul 624602 NaN
5 0.99 mul 624602 NaN
6 NaN NaN 900000 300
7 NaN add 900000 NaN
8 NaN NaN NaN NaN
In [5]: df2
Out[5]:
number price loc get
0 489245 200 aa up
1 584682 NaN ab NaN
2 624602 NaN bb NaN
3 900000 NaN cc dn
接下来合并'number'
上的两个数据框
In [6]: mdf = pandas.merge(df1,df2,on='number')
In [7]: mdf
Out[7]:
value method number price_x price_y loc get
0 0.50 add 489245 600 200 aa up
1 0.70 add 489245 NaN 200 aa up
2 0.70 mul 584682 225 NaN ab NaN
3 0.90 mul 624602 NaN NaN bb NaN
4 0.95 mul 624602 NaN NaN bb NaN
5 0.99 mul 624602 NaN NaN bb NaN
6 NaN NaN 900000 300 NaN cc dn
7 NaN add 900000 NaN NaN cc dn
当出现相同的列时,pandas.merge
将两者放入合并的 DataFrame 中并附加后缀。在这种情况下,我们想用 'price_y'
更新 'price_x'
并将结果称为 'price'
。为此,我们可以创建一个仅包含 'price_y'
中的数据的数据框,从合并的 DataFrame 中删除该列,并将价格列重命名回 'price'
.
In [8]: pdf = mdf.price_y
In [9]: pdf = pandas.DataFrame(pdf)
In [10]: del mdf['price_y']
In [11]: mdf.rename(columns = {'price_x':'price'},inplace=True)
In [12]: pdf.rename(columns = {'price_y':'price'},inplace=True)
In [13]: mdf
Out[13]:
value method number price loc get
0 0.50 add 489245 600 aa up
1 0.70 add 489245 NaN aa up
2 0.70 mul 584682 225 ab NaN
3 0.90 mul 624602 NaN bb NaN
4 0.95 mul 624602 NaN bb NaN
5 0.99 mul 624602 NaN bb NaN
6 NaN NaN 900000 300 cc dn
7 NaN add 900000 NaN cc dn
In [14]: pdf
Out[14]:
price
0 200
1 200
2 NaN
3 NaN
4 NaN
5 NaN
6 NaN
7 NaN
现在我们可以使用 .update
将 pdf
中的任何非 NaN 值放入 mdf
中。
In [15]: mdf.update(pdf)
In [16]: mdf
Out[16]:
value method number price loc get
0 0.50 add 489245 200 aa up
1 0.70 add 489245 200 aa up
2 0.70 mul 584682 225 ab NaN
3 0.90 mul 624602 NaN bb NaN
4 0.95 mul 624602 NaN bb NaN
5 0.99 mul 624602 NaN bb NaN
6 NaN NaN 900000 300 cc dn
7 NaN add 900000 NaN cc dn
如果需要一组更复杂的值选择规则,则将 mdf.update(pdf)
替换为 mdf.combine(pdf, function_of_two_variables_returning_preferred_value)
。
关于python - 在 Pandas 中部分合并,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20378041/