Pro*_*Sky 11 python dataframe pandas
我在python中有两个数据帧.我想使用来自另一个数据帧的匹配值来更新第一个数据帧中的行.第二个数据帧用作覆盖.
以下是具有相同数据和代码的示例:
DataFrame 1:
DataFrame 2:
我想根据匹配的代码和名称更新更新数据帧1.在此示例中,Dataframe 1应更新如下:
注意:Code = 2和Name = Company2的行更新为值1000(来自Dataframe 2)
import pandas as pd
data1 = {
'Code': [1, 2, 3],
'Name': ['Company1', 'Company2', 'Company3'],
'Value': [200, 300, 400],
}
df1 = pd.DataFrame(data1, columns= ['Code','Name','Value'])
data2 = {
'Code': [2],
'Name': ['Company2'],
'Value': [1000],
}
df2 = pd.DataFrame(data2, columns= ['Code','Name','Value'])
Run Code Online (Sandbox Code Playgroud)
任何指针或提示?
Nic*_*Nic 18
使用DataFrame.update,它对齐索引(https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.update.html):
>>> df1.set_index('Code', inplace=True)
>>> df1.update(df2.set_index('Code'))
>>> df1.reset_index() # to recover the initial structure
Code Name Value
0 1 Company1 200.0
1 2 Company2 1000.0
2 3 Company3 400.0
Run Code Online (Sandbox Code Playgroud)
WeN*_*Ben 13
你可以用concat+drop_duplicates
pd.concat([df1,df2]).drop_duplicates(['Code','Name'],keep='last').sort_values('Code')
Out[1280]:
Code Name Value
0 1 Company1 200
0 2 Company2 1000
2 3 Company3 400
Run Code Online (Sandbox Code Playgroud)
您可以先合并数据,然后使用numpy.where,这是使用方法numpy.where
updated = df1.merge(df2, how='left', on=['Code', 'Name'], suffixes=('', '_new'))
updated['Value'] = np.where(pd.notnull(updated['Value_new']), updated['Value_new'], updated['Value'])
updated.drop('Value_new', axis=1, inplace=True)
Code Name Value
0 1 Company1 200.0
1 2 Company2 1000.0
2 3 Company3 400.0
Run Code Online (Sandbox Code Playgroud)
小智 6
有可用的更新功能
例子:
df1.update(df2)
更多信息:
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.update.html
您可以对齐索引,然后使用combine_first:
res = df2.set_index(['Code', 'Name'])\
.combine_first(df1.set_index(['Code', 'Name']))\
.reset_index()
print(res)
# Code Name Value
# 0 1 Company1 200.0
# 1 2 Company2 1000.0
# 2 3 Company3 400.0
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
15166 次 |
| 最近记录: |