python - 在 Pandas 中部分合并

标签 python merge pandas

我在合并列重叠的 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

现在我们可以使用 .updatepdf 中的任何非 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/

相关文章:

python - 合并属于时间序列一部分的多个数据文件(具有多个列)

python - 如何打造一个完全自治的Python环境?

python - OpenCV 密集光流矩阵

java - java中根据key添加2个json对象

mysql - 如何合并 phpMyAdmin 中的两个表以免出现重复条目​​?

python - Pandas - 根据其他 3 列中的值在列中设置值

python - 过滤异常和复杂的数据集

Python:从文件中读取 igraph 的邻接矩阵

python - Sticky 命令如何影响 Tkinter 中的 python 代码?

r - 加快合并 R 中的许多数据帧