Pandas Concat 新专栏

Posted

技术标签:

【中文标题】Pandas Concat 新专栏【英文标题】:Pandas Concat new column 【发布时间】:2017-09-29 13:10:11 【问题描述】:

为什么我在“ACTION”列中得到 NaN? 我得到这个结果对我来说似乎很奇怪。我试过使用 ignore_index = True 并且它有一个频率错误。

                        C     H     L     O     OI       V   WAP  ACTION
datetime                                                                
2017-03-14 00:52:00  8.25  8.25  8.19  8.21  302.0  1769.0  8.22     NaN
2017-03-13 23:54:00  8.09  8.10  8.09  8.10    6.0    65.0  8.10     NaN
2017-03-14 01:03:00  8.29  8.32  8.28  8.29  175.0  1084.0  8.30     NaN
2017-03-14 00:03:00  8.15  8.15  8.14  8.15   13.0    50.0  8.15     NaN
2017-03-13 23:57:00  8.13  8.13  8.12  8.12    3.0     6.0  8.12     NaN

我想得到-

                        C     H     L     O     OI       V   WAP  ACTION
datetime                                                                
2017-03-14 00:52:00  8.25  8.25  8.19  8.21  302.0  1769.0  8.22     100
2017-03-13 23:54:00  8.09  8.10  8.09  8.10    6.0    65.0  8.10     200
2017-03-14 01:03:00  8.29  8.32  8.28  8.29  175.0  1084.0  8.30     300
2017-03-14 00:03:00  8.15  8.15  8.14  8.15   13.0    50.0  8.15     400
2017-03-13 23:57:00  8.13  8.13  8.12  8.12    3.0     6.0  8.12     500

buy_stp = pd.Series([100,200,300,400,500],name= 'ACTION')
print(buy_stp)
df10 = pd.concat([df_concat_results,
                  buy_stp],
                  axis=1,
                  join_axes=[df_concat_results.index])

print(df10)

【问题讨论】:

【参考方案1】:

您需要相同的索引 - SeriesDataFrame 用于对齐,否则获取 NaNs:

buy_stp.index = df.index
df['ACTION'] = buy_stp
print (df)
                        C     H     L     O     OI       V   WAP  ACTION
datetime                                                                
2017-03-14 00:52:00  8.25  8.25  8.19  8.21  302.0  1769.0  8.22     100
2017-03-13 23:54:00  8.09  8.10  8.09  8.10    6.0    65.0  8.10     200
2017-03-14 01:03:00  8.29  8.32  8.28  8.29  175.0  1084.0  8.30     300
2017-03-14 00:03:00  8.15  8.15  8.14  8.15   13.0    50.0  8.15     400
2017-03-13 23:57:00  8.13  8.13  8.12  8.12    3.0     6.0  8.12     500

或者:

buy_stp = pd.Series([100,200,300,400,500],name= 'ACTION', index=df.index)
print(buy_stp)
datetime
2017-03-14 00:52:00    100
2017-03-13 23:54:00    200
2017-03-14 01:03:00    300
2017-03-14 00:03:00    400
2017-03-13 23:57:00    500
Name: ACTION, dtype: int64

df['ACTION'] = buy_stp
print (df)
                        C     H     L     O     OI       V   WAP  ACTION
datetime                                                                
2017-03-14 00:52:00  8.25  8.25  8.19  8.21  302.0  1769.0  8.22     100
2017-03-13 23:54:00  8.09  8.10  8.09  8.10    6.0    65.0  8.10     200
2017-03-14 01:03:00  8.29  8.32  8.28  8.29  175.0  1084.0  8.30     300
2017-03-14 00:03:00  8.15  8.15  8.14  8.15   13.0    50.0  8.15     400
2017-03-13 23:57:00  8.13  8.13  8.12  8.12    3.0     6.0  8.12     500

如果通过valueslist 转换为numpy array 也有效,只需dfbuy_stp 的长度相同:

df['ACTION'] = buy_stp.values
print (df)
                        C     H     L     O     OI       V   WAP  ACTION
datetime                                                                
2017-03-14 00:52:00  8.25  8.25  8.19  8.21  302.0  1769.0  8.22     100
2017-03-13 23:54:00  8.09  8.10  8.09  8.10    6.0    65.0  8.10     200
2017-03-14 01:03:00  8.29  8.32  8.28  8.29  175.0  1084.0  8.30     300
2017-03-14 00:03:00  8.15  8.15  8.14  8.15   13.0    50.0  8.15     400
2017-03-13 23:57:00  8.13  8.13  8.12  8.12    3.0     6.0  8.12     500

df['ACTION'] = buy_stp.tolist()
print (df)
                        C     H     L     O     OI       V   WAP  ACTION
datetime                                                                
2017-03-14 00:52:00  8.25  8.25  8.19  8.21  302.0  1769.0  8.22     100
2017-03-13 23:54:00  8.09  8.10  8.09  8.10    6.0    65.0  8.10     200
2017-03-14 01:03:00  8.29  8.32  8.28  8.29  175.0  1084.0  8.30     300
2017-03-14 00:03:00  8.15  8.15  8.14  8.15   13.0    50.0  8.15     400
2017-03-13 23:57:00  8.13  8.13  8.12  8.12    3.0     6.0  8.12     500

【讨论】:

【参考方案2】:

如果我理解正确,您只想在数据框中添加一列。如果是这样,这是最简单的方法。

df['Action'] = buy_stp

【讨论】:

这就是我想要做的。看来我的索引需要与 Jezrael 在下面指出的相同。

以上是关于Pandas Concat 新专栏的主要内容,如果未能解决你的问题,请参考以下文章

pandas数据合并之append与concat

Pandas的concat方法

pandas concat 2个数据框,并在合并数据中添加一列新数据。

Pandas 中的 Concat 2 列 - AttributeError:“DataFrame”对象没有属性“concat”

为啥 Pandas 串联 (pandas.concat) 的内存效率如此之低?

Python数据分析库pandas ------ mergeconcatenation pd.concat合并与拼接