如何在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')
我才刚开始,我非常感谢你可能给我的所有帮助!非常非常感谢你!