Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用另一个数据帧的值替换一个数据帧中的列值_Python_Search_Pandas_Dataframe - Fatal编程技术网

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

Python 用另一个数据帧的值替换一个数据帧中的列值,python,search,pandas,dataframe,Python,Search,Pandas,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

我有两个数据帧,第一个有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
具有不同的值,有时会重复,但通常约有50个唯一值

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

Group             Hotel
tri23_1           Jamel
hsgç_T2           Frank
bbbj-1Y_jn        Luxy
mlkl_781          Grand Hotel
vchs_94           Vancouver
我的目标是用第二个数据帧的
Hotel
列的相应值替换第一个数据帧的
Group
列中的值/或者用相应的值创建
Hotel
列。当我试图通过这样的任务来完成它时

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

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

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

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

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

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

只需使用pandas join,您可以参考详细信息链接:


数据帧中的列只是系列。使数据帧(或数据帧和系列,如图所示)共享相同的索引,以便可以从系列分配到数据帧:

**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
请注意,两者的索引都是“Group”,它允许赋值


如果将相似的索引序列分配给数据帧列,则分配有效。请注意,尽管df中存在重复的组值,但这仍然有效。如果hotel_groups系列中存在重复的索引值(具有不同的对应数据值)(例如,如果索引值hsgc_T2有两个条目,第一个条目的数据值为Frank,第二个条目的数据值为Luxy,分配给df[‘hotel’](在您的示例中不会出现这种情况)。这是行不通的,因为没有办法知道要为类似索引的数据帧列分配哪个值。

这是一个老问题,但这里有另一种方法,它与pandas方法不同,但速度很快

复制数据帧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
从dataframe 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'}
通过查找值并指定给dataframe 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

好奇:如果
df1['Group']
没有
df['Group']
中的所有值,这个答案会发生什么变化?好奇:如果
df2['Group']
没有
df1['Group']中的所有值,这个答案会发生什么变化
?这将在
df1
中添加
Hotel
列,我认为OP不希望这样做。
    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