我有一个像这样的pandas数据框:
frame = pd.DataFrame(
[[pd.Timestamp('2014-01-01'), pd.Timestamp('2014-01-02')]],
columns=("date", "timestamp"),
)
>>> frame
date timestamp
0 2014-01-01 2014-01-02
我还有一个像这样的值列表 - 注意numpy NaN作为第二个值:
vals = [1, np.NaN]
我想最终得到一个数据框new_frame
,其中来自frame
的行重复次数与vals
中的项目一样多次,我想添加一个val
列到frame
,其中每行中的值对应列表vals
中的值。它应该是这样的:
date timestamp val
0 2014-01-01 2014-01-02 1
1 2014-01-01 2014-01-02 NaN
目前我这样做:
new_frame = pd.concat([frame]*len(vals))
new_frame = new_frame.set_index([list(range(0, len(vals)))])
new_frame['value'] = pd.Series(vals)
我想知道,有没有更简洁的方法来做到这一点,或许在pandas中使用一些内置功能?
答案 0 :(得分:0)
你可以这样做:
frame2 = pd.DataFrame([frame.ix[0]]*len(vals))
frame2.index = range(len(vals))
frame2['val'] = vals
这会通过重复现有框架的第一行来创建数据框,然后添加列val
。
如果您在创建数据框frame
时可以负担得起,则可以执行以下操作:
frame = pd.DataFrame(
[[pd.Timestamp('2014-01-01'), pd.Timestamp('2014-01-02')] for x in vals],
columns=("date", "timestamp"),
)
frame['val'] = vals
这会创建一个具有正确行数的数据框,然后添加列val
。
答案 1 :(得分:0)
也许您可以按方法date
使用concat
和fillna
列timestamp
和ffill
- 转发NaN
值:
print frame
# date timestamp
#0 2014-01-01 2014-01-02
vals = [1, np.NaN, 2, np.nan]
print vals
#[1, nan, 2, nan]
df = pd.concat([frame, pd.Series(vals, name='value')], axis=1)
df[['date','timestamp']] = df[['date','timestamp']].fillna(method='ffill')
print df
# date timestamp value
#0 2014-01-01 2014-01-02 1
#1 2014-01-01 2014-01-02 NaN
#2 2014-01-01 2014-01-02 2
#3 2014-01-01 2014-01-02 NaN
或使用ffill
:
print frame
# date timestamp
#0 2014-01-01 2014-01-02
vals = [1, np.NaN, 2, np.nan]
print vals
#[1, nan, 2, nan]
df = pd.concat([frame, pd.Series(vals, name='value')], axis=1)
df[['date','timestamp']] = df[['date','timestamp']].ffill()
print df
# date timestamp value
#0 2014-01-01 2014-01-02 1
#1 2014-01-01 2014-01-02 NaN
#2 2014-01-01 2014-01-02 2
#3 2014-01-01 2014-01-02 NaN