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

我需要完成两个数据帧中某些列的字段才能创建最后一个。

第一个数据框是这个。它包含一个组中的所有孩子。他们有自己的名字和所属的城市。在他们的名字或他们的城市中永远不会有 NaN。但是两个孩子的名字可以相同,但他们将永远属于不同的城市。(例如:有一个来自迈阿密的 Betty 和来自马德里的 Betty - 两个不同的孩子。)

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

其中一些孩子将前往纽约的 MET 博物馆。有些写了他们的名字和他们的城市,有些只写了他们的名字。但他们中没有人只写他们的城市,而不写他们的名字。如果两个孩子有相同的名字(例如贝蒂),但她只写了她的名字,那么两个名叫贝蒂的女孩都会去旅行(不公平,但他们会喜欢)。他们之间的区别将是他们所属的城市。(看例子)

第二个数据帧是这样的。它代表了将参加这次旅行的孩子的名单,包括他们的名字、他们所属的城市以及他们从家到纽约麻省理工学院博物馆的首选交通方式。

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

所以由于上面的列表写的不是很清楚,应该更正。除了上面提到的条件,还有一个:

  • 如果孩子写了所有需要的信息(姓名、城市和首选交通工具),那么他/她在首选交通工具中的相关字段将保持不变。
  • 如果孩子只写了一些需要的信息(姓名、城市),那么首选传输的相关字段将为 NaN,因为它丢失了。
  • 如果一个孩子只写了他/她的名字,那么所有同名的孩子都会被列入名单,并与他们的城市相关联(例如,只有名字贝蒂出现 --> 那么它将是贝蒂 | 马德里和贝蒂 | 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')

我才刚开始,我非常感谢你可能给我的所有帮助!非常非常感谢你!

以上是如何在Python中连接两个数据框?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>