2016-10-05 99 views
0

假设任何列的值都可以更改的数据框给定另一个包含旧值,新值和列所属的数据框,如何使用有关更改的信息更新数据框? 例如:使用其他数据框中的值更新熊猫数据框

>>> my_df 
    x y z 
0 1 2 5 
1 2 3 9 
2 8 7 2 
3 3 4 7 
4 6 7 7 

my_df_2包含有关改变值及其列的信息:

>>> my_df_2 
    changed_col old_value new_value 
0  x    2    10 
1  z    9    20 
2  x    1    12 
3  y    4    23 

如何使用信息my_df_2更新my_df这样my_df现在变成:

>>> my_df 
    x  y  z 
0 12 2  5 
1 10 3  20 
2 8  7  2 
3 3  23 7 
4 6  7  7 

回答

2

您可以创建一个字典,如下所示:

d = {i: dict(zip(j['old_value'], j['new_value'])) for i, j in my_df_2.groupby('changed_col')} 

d 
Out: {'x': {1: 12, 2: 10}, 'y': {4: 23}, 'z': {9: 20}} 

然后在DataFrame.replace使用它:

my_df.replace(d) 
Out: 
    x y z 
0 12 2 5 
1 10 3 20 
2 8 7 2 
3 3 23 7 
4 6 7 7 
0

您可以使用更新方法。见http://pandas.pydata.org/pandas-docs/version/0.17.1/generated/pandas.DataFrame.update.html

实施例:

old_df = pd.DataFrame({"a":np.arange(5), "b": np.arange(4,9)}) 

+----+-----+-----+ 
| | a | b | 
|----+-----+-----| 
| 0 | 0 | 4 | 
| 1 | 1 | 5 | 
| 2 | 2 | 6 | 
| 3 | 3 | 7 | 
| 4 | 4 | 8 | 
+----+-----+-----+ 

new_df = pd.DataFrame({"a":np.arange(7,8), "b": np.arange(10,11)}) 
+----+-----+-----+ 
| | a | b | 
|----+-----+-----| 
| 0 | 7 | 10 | 
+----+-----+-----+ 

old_df.update(new_df) 
+----+-----+-----+ 
| | a | b | 
|----+-----+-----| 
| 0 | 7 | 10 | #Changed row 
| 1 | 1 | 5 | 
| 2 | 2 | 6 | 
| 3 | 3 | 7 | 
| 4 | 4 | 8 | 
+----+-----+-----+