python- 在 for 循环中连接并附加一个 pandas 数据帧
python- concatenate and append a pandas dataframe in a for loop
很抱歉,我真的不知道如何表达这个问题的标题。
我不经常使用 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,我才刚刚开始使用 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]