对不起,我真的不知道该题目的标题。
我不经常使用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/

10-12 17:54
查看更多