根据给定列表向pandas数据帧添加行和列

时间:2016-01-14 19:30:56

标签: python pandas

我有一个像这样的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中使用一些内置功能?

2 个答案:

答案 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使用concatfillnatimestampffill - 转发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