对不起,我真的不知道该题目的标题。
我不经常使用Python,而只是开始使用pandas和numpy软件包。
尝试在for循环中连接并附加pandas数据框时,出现意外结果。
我有一个从sql获取的数据集,并放入了pandas数据框(df):
print(df.head())
date visitor visitor_score home home_score W L
0 20160405 BOS 6 CLE 2 94 67
1 20160406 BOS 6 CLE 7 94 67
2 20160408 BOS 8 TOR 7 89 73
3 20160409 BOS 8 TOR 4 89 73
4 20160410 BOS 0 TOR 3 89 73
我有另一个来自sql的数据集,我也将其放在pandas数据框中(dfBostonStats):
print(dfBostonStats.head())
teamID ab h 2b 3b hr so sb ra er era IPouts HA \
0 BOS 5670 1598 343 25 208 1160 83 694 640 4.0 4319 1342
hra soa e fp bpf ppf dp
0 176 1362 75 0.987 108 106 139
我想将该数据帧(dfBostonStats)连接到第一个数据帧(df)的每一行。
我确定可以使用pandas.concat,并通过串联df的第一行证明了这一点:
print(pd.concat([df.iloc[[0]], dfBostonStats], axis=1))
date visitor visitor_score home home_score W L teamID ab \
0 20160405 BOS 6 CLE 2 94 67 BOS 5670
h ... era IPouts HA hra soa e fp bpf ppf dp
0 1598 ... 4.0 4319 1342 176 1362 75 0.987 108 106 139
然后,我尝试使用for循环将每一行连接起来,但这给了我意外的结果。
它正确地连接了一行,但随后只显示我列出的第二个数据帧的行(dfBostonStats)
for index, element in df.iterrows():
tempdf = pd.concat([df.iloc[[index]], dfBostonStats], axis=1)
concatDataFrame = concatDataFrame.append(tempdf, ignore_index=True)
print(concatDataFrame.head())
date visitor visitor_score home home_score W L teamID \
0 20160405 BOS 6.0 CLE 2.0 94.0 67.0 BOS
1 NaN NaN NaN NaN NaN NaN NaN BOS
2 20160406 BOS 6.0 CLE 7.0 94.0 67.0 NaN
3 NaN NaN NaN NaN NaN NaN NaN BOS
4 20160408 BOS 8.0 TOR 7.0 89.0 73.0 NaN
ab h ... era IPouts HA hra soa e fp \
0 5670.0 1598.0 ... 4.0 4319.0 1342.0 176.0 1362.0 75.0 0.987
1 5670.0 1598.0 ... 4.0 4319.0 1342.0 176.0 1362.0 75.0 0.987
2 NaN NaN ... NaN NaN NaN NaN NaN NaN NaN
3 5670.0 1598.0 ... 4.0 4319.0 1342.0 176.0 1362.0 75.0 0.987
4 NaN NaN ... NaN NaN NaN NaN NaN NaN NaN
bpf ppf dp
0 108.0 106.0 139
1 108.0 106.0 139
2 NaN NaN NaN
3 108.0 106.0 139
4 NaN NaN NaN
我不知道为什么只用dfBostonStats打印该行,而不是只打印串联的行?
顺便说一句,我知道在for循环中每次都会出现一个副本,这会导致性能下降,但是我认为一旦获得数据后应该立即处理。
最佳答案
我认为如果需要按列visitor
连接第一个数据帧,然后按列teamID
连接第二个数据帧,请使用merge
进行左连接。无需循环:
print (df)
date visitor visitor_score home home_score W L
0 20160405 BOS 6 CLE 2 94 67
1 20160406 BOS 6 CLE 7 94 67
2 20160408 AAA 8 TOR 7 89 73
3 20160409 AAA 8 TOR 4 89 73
4 20160410 AAA 0 TOR 3 89 73
print (dfBostonStats)
teamID ab h 2b 3b hr so sb ra er era IPouts HA \
0 BOS 5670 1598 343 25 208 1160 83 694 640 4.0 4319 1342
0 AAA 4 5 6 4 5 1160 83 694 640 4.0 4319 1342
hra soa e fp bpf ppf dp
0 176 1362 75 0.987 10 106 139
0 176 1362 75 0.987 10 106 139
df2 = df.merge(dfBostonStats, left_on='visitor', right_on='teamID', how='left')
print (df2)
date visitor visitor_score home home_score W L teamID ab \
0 20160405 BOS 6 CLE 2 94 67 BOS 5670
1 20160406 BOS 6 CLE 7 94 67 BOS 5670
2 20160408 AAA 8 TOR 7 89 73 AAA 4
3 20160409 AAA 8 TOR 4 89 73 AAA 4
4 20160410 AAA 0 TOR 3 89 73 AAA 4
h ... era IPouts HA hra soa e fp bpf ppf dp
0 1598 ... 4.0 4319 1342 176 1362 75 0.987 10 106 139
1 1598 ... 4.0 4319 1342 176 1362 75 0.987 10 106 139
2 5 ... 4.0 4319 1342 176 1362 75 0.987 10 106 139
3 5 ... 4.0 4319 1342 176 1362 75 0.987 10 106 139
4 5 ... 4.0 4319 1342 176 1362 75 0.987 10 106 139
[5 rows x 27 columns]
关于python - python-在for循环中串联并附加一个pandas数据框,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48705865/