考虑数据框df
df = pd.DataFrame(np.random.rand(5, 3),
['p0', 'p1', 'p2', 'p3', 'p4'],
['A', 'B', 'C'])
df
每一行的意思:
dm = df.mean(1)
dm.index = ['m0', 'm1', 'm2', 'm3', 'm4']
dm
m0 0.352396
m1 0.606469
m2 0.643022
m3 0.560809
m4 0.776058
dtype: float64
如何将这一系列方法附加到df
的每一列。我希望结果看起来像:
此外,由于这将大规模应用,时间至关重要。
我用来生成预期输出的是:
pd.concat([df, pd.DataFrame({c: dm for c, i in df.iteritems()})])
答案 0 :(得分:1)
您可以使用双concat
:
print (pd.concat([dm] * df.shape[1], axis=1, keys=df.columns))
A B C
m0 0.823788 0.823788 0.823788
m1 0.615354 0.615354 0.615354
m2 0.606740 0.606740 0.606740
m3 0.386629 0.386629 0.386629
m4 0.637147 0.637147 0.637147
print (pd.concat([df, pd.concat([dm] * df.shape[1], axis=1, keys=df.columns)]))
A B C
p0 0.789966 0.699837 0.981560
p1 0.415609 0.469310 0.961144
p2 0.920938 0.476615 0.422665
p3 0.323782 0.805231 0.030874
p4 0.761674 0.361134 0.788632
m0 0.823788 0.823788 0.823788
m1 0.615354 0.615354 0.615354
m2 0.606740 0.606740 0.606740
m3 0.386629 0.386629 0.386629
m4 0.637147 0.637147 0.637147
要创建附加的df
,可以使用numpy repeat
和numpy.newaxis
:
x = dm.values
print (pd.DataFrame(np.repeat(x[:, np.newaxis], df.shape[1], 1),
columns=df.columns,
index=dm.index))
A B C
m0 0.399837 0.399837 0.399837
m1 0.890191 0.890191 0.890191
m2 0.580747 0.580747 0.580747
m3 0.354032 0.354032 0.354032
m4 0.329108 0.329108 0.329108
print(pd.concat([df, pd.DataFrame(np.repeat(x[:, np.newaxis], df.shape[1], 1),
columns=df.columns,
index=dm.index)]))
A B C
p0 0.087337 0.375891 0.736282
p1 0.777897 0.932047 0.960629
p2 0.945546 0.062647 0.734047
p3 0.247740 0.582076 0.232282
p4 0.078683 0.869736 0.038905
m0 0.399837 0.399837 0.399837
m1 0.890191 0.890191 0.890191
m2 0.580747 0.580747 0.580747
m3 0.354032 0.354032 0.354032
m4 0.329108 0.329108 0.329108
EDIT1:
使用numpy.tile
创建新df
的另一种解决方案:
dm2 = pd.DataFrame(np.tile(dm.values[:, None], (1, df.shape[1])), dm.index, df.columns)
df.append(dm2)
答案 1 :(得分:1)
你去,老运动:
df.apply(lambda S:S.append(dm))
初步测试让jezrael的回答更快:
In [5]: timeit pd.concat([df, pd.concat([dm] * 3, axis=1, keys=df.columns)])
100 loops, best of 3: 4.75 ms per loop
In [6]: timeit df.apply(lambda S:S.append(dm))
100 loops, best of 3: 8.7 ms per loop
答案 2 :(得分:1)
您可以创建另一个数据框,其中dictionary
为keys
作为列名,values
为dm
。然后,您可以连接两个数据帧:
df2 = pd.DataFrame({'A': dm, 'B': dm, 'C': dm})
con = (df, df2)
df3 = pd.concat(con)
答案 3 :(得分:1)
我想我找到了答案。
dm3 = pd.DataFrame(dm.values[:, None].repeat(df.shape[1], axis=1),
dm.index, df.columns)
df.append(dm3)
查看相关的更新时间。这种解决方案在较大规模下更好地提供。我不能接受这个答案2天。我仍然愿意接受更好的解决方案。
答案 4 :(得分:1)
大致相同,可能取决于规模?如果你可以在不转换为数据帧的情况下插入它会更快...索引将是0-4 ......但无法找到
%timeit dm3 = pd.DataFrame(dm.values[:, None].repeat(df.shape[1], axis=1),dm.index, df.columns);df.append(dm3)
1000 loops, best of 3: 536 µs per loop
%timeit pd.concat([df, pd.DataFrame(np.ones((5,3))*dm.values[:, np.newaxis], columns=df.columns,index=dm.index ) ])
1000 loops, best of 3: 535 µs per loop