gpt4 book ai didi

python - 如何在 Python 中连接两个数据框?

转载 作者:行者123 更新时间:2023-12-03 17:22:17 26 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Pandas Merging 101

(6 个回答)


5 个月前关闭。




我需要完成两个数据帧中某些列的字段才能创建最后一个。
第一个数据框是这个。它包含一个组中的所有 child 。他们有自己的名字和所属的城市。在他们的名字或他们的城市中永远不会有 NaN。但是两个 child 的名字可以相同,但他们将永远属于不同的城市。 (例如:有一个来自迈阿密的 Betty 和来自马德里的 Betty - 两个不同的 child 。)

data = {'Kids': ['Ronnie', 'Sofia', 'Manny', 'Claire Ann', 'Joe', 'Betty', 'Cheryl', 'Archie', 'Joe', 'Phil' ,'Luke', 'Alex', 'Haley', 'Joe', 'Betty'],
'City': ['New York City', 'Boston', 'Los Angeles', 'San Francisco', 'Detroit', 'Miami', 'London', 'Bruxelles' ,'Paris', 'Berlin', 'Stockholm', 'Amsterdam', 'Massachusetts', 'Barcelona','Madrid']}

all_kids_df = pd.DataFrame (data, columns = ['Kids', 'City'])
它看起来像这样:
          Kids           City
0 Ronnie New York City
1 Sofia Boston
2 Manny Los Angeles
3 Claire Ann San Francisco
4 Joe Detroit
5 Betty Miami
6 Cheryl London
7 Archie Bruxelles
8 Joe Paris
9 Phil Berlin
10 Luke Stockholm
11 Alex Amsterdam
12 Haley Massachusetts
13 Joe Barcelona
14 Betty Madrid
其中一些 child 将前往纽约的 MET 博物馆。有些写了他们的名字和他们的城市,有些只写了他们的名字。但他们中没有人只写他们的城市,而不写他们的名字。如果两个 child 有相同的名字(例如贝蒂),但她只写了她的名字,那么两个叫贝蒂的女孩都会去旅行(不公平,但他们会喜欢)。他们之间的区别将是他们所属的城市。 (看例子)
第二个数据帧是这样的。它代表将参加这次旅行的 child 的名单,包括他们的名字、他们所属的城市以及他们从家到纽约麻省理工学院博物馆的首选交通方式。
data = {'Kids': ['Sofia', 'Claire Ann', 'Joe', 'Betty', 'Archie', 'Joe', 'Phil' ,'Luke',],
'City': ['Boston', np.nan, 'Detroit', np.nan, 'Bruxelles' , np.nan, 'Berlin', np.nan],
'Preferred Transport': ['Bus', np.nan, 'Train', 'Car', np.nan, 'Airplane', 'Ship', 'Airplane']}

nyc_trip_df = pd.DataFrame (data, columns = ['Kids', 'City', 'Preferred Transport'])
它看起来像这样:
         Kids       City Preferred Transport
0 Sofia Boston Bus
1 Claire Ann NaN NaN
2 Joe Detroit Train
3 Betty NaN Car
4 Archie Bruxelles NaN
5 Joe NaN Airplane
6 Phil Berlin Ship
7 Luke NaN Airplane
所以由于上面的列表写的不是很清楚,应该更正。除了上面提到的条件,还有一个:
  • 如果 child 写了所有需要的信息(姓名、城市和首选交通工具),那么他/她在首选交通工具中的相关字段将保持不变。
  • 如果 child 只写了一些需要的信息(姓名、城市),那么首选传输的相关字段将为 NaN,因为它丢失了。
  • 如果一个 child 只写了他/她的名字,那么所有同名的 child 都将被列入名单,并与他们的城市相关联(例如,只有名字 Betty 出现 --> 那么它将是 Betty | Madrid 和 Betty | Miami) 和 NaN 在首选传输部分。
  • 如果例如乔|底特律出现了,另一个乔没有他的城市,但有他喜欢的交通工具 - 飞机,然后是乔 |底特律将保留他的首选传输(NaN 或他选择的任何内容),而另一个 Joe 将复制到 Joe | 中。巴黎和乔|巴塞罗那,两者都将飞机作为首选交通工具。

  • 最终结果列表应该是这样的:
             Kids           City Preferred Transport
    0 Sofia Boston Bus
    1 Claire Ann San Francisco NaN
    2 Joe Detroit Train
    3 Betty Miami Car
    4 Betty Madrid Car
    5 Archie Bruxelles NaN
    6 Joe Paris Airplane
    7 Joe Barcelona Airplane
    8 Phil Berlin Ship
    9 Luke Stockholm Airplane
    我尝试编写此代码,但我觉得我在某些时候丢失了数据。它包含了如此多的冗长。
    n = len(kids_list)
    aux_kids_list = []
    aux_city_list = []
    for i in range(0, n):
    if (city_list[i] != np.nan & transport_list[i] == np.nan):
    transport_list[i] = df.loc[df['Kids'] == kids_list[i] & df['City'] == city_list[i], 'Preferred Transport']
    if (city_list[i] == np.nan):
    here = -1
    for name in kids_list:
    here += 1
    if name == kids_list[i]:
    aux_kids_list.append(kids_list[i])
    aux_city_list.append(city_list[here])
    aux_transport_list.append(df.loc[df['Kids'] == kids_list[i] & df['City'] == city_list[i], 'Preferred Transport'])


    final_kids_list = kids_list + aux_kids_list
    final_city_list = city_list + aux_city_list
    final_transport_list = transport_list + aux_transport_list


    data = {'Kids': final_kids_list,
    'City': final_city_list,
    'Preferred Transport': final_transport_list }

    final_list_nyc_trip_df = pd.DataFrame (data, columns = ['Kids', 'City', 'Preferred Transport'])
    final_list_nyc_trip_df = final_list_nyc_trip_df.drop_duplicates(keep='first')
    我才刚开始,我非常感谢你可能给我的所有帮助!非常非常感谢你!

    最佳答案

    我认为你可以采取以下方法:

  • 在这两个数据帧之间构建一个新的共享 key ,该 key 在同一个人之间共享(即使数据丢失)
  • 使用 df.merge函数将这两个数据帧合并在一起。

  • 上面的难点是确保您的共享 key 有意义。我认为将名称连接到城市应该可行 - 尽管当人们没有输入他们的城市时可能会有点古怪。在这种情况下,我认为您可以构建另一个共享 key (仅包含名称)并对其进行合并。

    关于python - 如何在 Python 中连接两个数据框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66990824/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com