Python pandas通过在另一个具有不同标签的DataFrame中搜索来替换DataFrame的值

qvk1mo1f  于 2023-09-29  发布在  Python
关注(0)|答案(2)|浏览(172)

我有两个 Dataframe 。df1包含城市和访问总数。df2包含VISITS记录。
定期用新访视时df2的数据更新df1

df1示例(更新前)

ID    NAME     VISITS
---
01    CITY1    01
02    CITY2    01
...
06    CITYZ    12

df2示例

CITY     NUMBER
---
...
CITY1    01
CITY2    01    <--- highest of CITY2
CITYZ    13
CITY1    02
...
CITYZ    14
CITY1    03    <--- highest of CITY1
CITYZ    15    <--- highest of CITYZ

要更新,它将在df2['CITY']中查找df1['NAME'](这是相关性),并将最高的df2['NUMBER']放入该CITY的df1['VISITS']中。
更新后df1

ID    NAME     VISITS
---
01    CITY1    03    <--- updated
02    CITY2    01    <--- updated or not, it doesn't matter
...
06    CITYZ    15    <--- updated

我的方法:

df2.loc[df2['CITY'] == 'CITYZ', 'NUMBER'].max()

我得到了“CITIZ”(硬编码)的最大数量,但我不知道如何将其链接到df1
下一个显然是错误的,但它的想法:

df1['VISITS'] = df2.loc[df2['CITY'] == df1['NAME'], 'NUMBER'].max()

此“解决方案”给出以下错误:ValueError:只能比较具有相同标签的Series对象

jdzmm42g

jdzmm42g1#

您可以从df2中删除重复的值,只保留最后更新的值(如果您的城市已经按'NUMBER'排序,您可以删除sort_values):

df1['VISITS'] = df1['NAME'].map(df2.sort_values('NUMBER', ascending=True)
                                   .drop_duplicates('CITY', keep='last')
                                   .set_index('CITY')['NUMBER'])
print(df1)

# Output
   ID   NAME  VISITS
0   1  CITY1       3
1   2  CITY2       1
2   6  CITYZ      15

根据@Nick的回答:

df1['VISITS'] = df1['NAME'].map(df2.groupby('CITY')['NUMBER'].max())

输入数据:

>>> df1
   ID   NAME  VISITS
0   1  CITY1       1
1   2  CITY2       1
2   6  CITYZ      12

>>> df2
    CITY  NUMBER
0  CITY1       1
1  CITY2       1
2  CITYZ      13
3  CITY1       2
4  CITYZ      14
5  CITY1       3
6  CITYZ      15
sz81bmfz

sz81bmfz2#

一种方法是将VISITS列从df1中删除,然后将join删除到df2,并按CITY分组并聚合为max,将NUMBER列重命名为VISITS

out = (df1
       .drop('VISITS', axis=1)
       .set_index('NAME')
       .join(df2.groupby('CITY')['NUMBER'].max())
       .rename(columns={'NUMBER':'VISITS'})
       .reset_index()
      )

示例数据的输出:

NAME  ID  VISITS
0  CITY1   1       3
1  CITY2   2       1
2  CITYZ   6      15

相关问题