繁体   English   中英

用另一个数据帧的值替换一个数据帧中的列值

[英]replace column values in one dataframe by values of another dataframe

我有两个数据框,第一个有 1000 行,看起来像:

Date            Group         Family       Bonus
2011-06-09      tri23_1       Laavin       456
2011-07-09      hsgç_T2       Grendy       679
2011-09-10      bbbj-1Y_jn    Fantol       431
2011-11-02      hsgç_T2       Gondow       569

Group具有不同的值,有时会重复,但通常大约有 50 个唯一值。

第二个数据框包含所有这 50 个唯一值(50 行)以及与这些值关联的酒店:

Group             Hotel
tri23_1           Jamel
hsgç_T2           Frank
bbbj-1Y_jn        Luxy
mlkl_781          Grand Hotel
vchs_94           Vancouver

我的目标是替换值列Group由列的相应值的第一数据帧的Hotel第二数据帧的/或创建列Hotel与相应的值。 当我试图通过分配来实现它时

df1.loc[(df1.Group=df2.Group), 'Hotel']=df2.Hotel

我有一个错误,即数据帧的大小不相等,因此无法进行比较

如果您将索引设置为另一个df上的“组”列,则可以使用原始df“组”列上的map替换:

In [36]:
df['Group'] = df['Group'].map(df1.set_index('Group')['Hotel'])
df

Out[36]:
         Date  Group  Family  Bonus
0  2011-06-09  Jamel  Laavin    456
1  2011-07-09  Frank  Grendy    679
2  2011-09-10   Luxy  Fantol    431
3  2011-11-02  Frank  Gondow    569

这是一个老问题,但这是另一种方法,它不像熊猫的方式,但速度很快

再现数据帧 1 - 这将被更新

df_1

    Date    Group   Family  Bonus
0   2011-06-09  tri23_1     Laavin  456
1   2011-07-09  hsgç_T2     Grendy  679
2   2011-09-10  bbbj-1Y_jn  Fantol  431
3   2011-11-02  hsgç_T2     Gondow  569

再现数据帧 2 - 查找

df_2

    Group   Hotel
0   tri23_1     Jamel
1   hsgç_T2     Frank
2   bbbj-1Y_jn  Luxy
3   mlkl_781    Grand Hotel
4   vchs_94     Vancouver

从数据框 1 中获取所有酒店 ID(关键列)作为列表

key_list = list(df_1['Group'])

['tri23_1', 'hsgç_T2', 'bbbj-1Y_jn', 'hsgç_T2']

从具有键 col 和值 col 的查找数据帧创建字典

dict_lookup = dict(zip(df_2['Group'], df_2['Hotel']))

{'bbbj-1Y_jn': 'Luxy',
 'hsgç_T2': 'Frank',
 'mlkl_781': 'Grand Hotel',
 'tri23_1': 'Jamel',
 'vchs_94': 'Vancouver'}

通过查找值创建列表来替换值并分配给数据框 1 列

df_1['Group'] = [dict_lookup[item] for item in key_list]

更新数据框 1

    Date    Group   Family  Bonus
0   2011-06-09  Jamel   Laavin  456
1   2011-07-09  Frank   Grendy  679
2   2011-09-10  Luxy    Fantol  431
3   2011-11-02  Frank   Gondow  569

您还可以创建一个字典并使用apply:

hotel_dict = df2.set_index('Group').to_dict()
df1['Group'] = df1['Group'].apply(lambda x: hotel_dict[x])

只需使用pandas join,您可以参考详细链接: http//pandas.pydata.org/pandas-docs/stable/merging.html

df1.join(df2,on='Group')

pandas DataFrames中的列只是Series。 使DataFrames(或DataFrame和Series,如此处所示)共享相同的索引,以便从Series到DataFrame进行分配:

**In:**

df = pd.DataFrame(data=
{'date': ['2011-06-09', '2011-07-09', '2011-09-10', '2011-11-02'], 
'family': ['Laavin', 'Grendy', 'Fantol', 'Gondow'], 
'bonus': ['456', '679', '431', '569']}, 
index=pd.Index(name='Group', data=['tri23_1', 'hsgç_T2', 'bbbj-1Y_jn', 'hsgç_T2']))

**Out:**
            date    family  bonus
Group           
tri23_1 2011-06-09  Laavin  456
hsgç_T2 2011-07-09  Grendy  679
bbbj-1Y_jn  2011-09-10  Fantol  431
hsgç_T2 2011-11-02  Gondow  569

**In:**

hotel_groups = pd.Series(['Jamel', 'Frank', 'Luxy', 'Grand Hotel', 'Vancouver'], 
index=pd.Index(name='Group', data=['tri23_1', 'hsgç_T2', 'bbbj-1Y_jn', 'mlkl_781', 'vchs_94']))

**Out:**

Group
tri23_1             Jamel
hsgç_T2             Frank
bbbj-1Y_jn           Luxy
mlkl_781      Grand Hotel
vchs_94         Vancouver
dtype: object

**In:**

df['hotel'] = hotel_groups

**Out:**

            date    family  bonus hotel
Group               
tri23_1 2011-06-09  Laavin  456 Jamel
hsgç_T2 2011-07-09  Grendy  679 Frank
bbbj-1Y_jn  2011-09-10  Fantol  431 Luxy
hsgç_T2 2011-11-02  Gondow  569 Frank

请注意,两者的索引都是“组”,允许分配。

如果将like-indexed Series分配给DataFrame列,则分配有效。 请注意,尽管df中存在重复的组值,但这仍然有效。 如果在hotel_groups系列中存在重复的索引值(具有不同的相应数据值),则不起作用(例如,如果索引值hsgc_T2有两个条目,第一个具有数据值Frank,第二个具有数据值Luxy,正在分配给df ['hotel'](并不是说你的例子中会出现这种情况)。这不起作用,因为没有办法知道分配索引相同的DataFrame列的值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM