[英]pandas append same series to each column
考慮數據幀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()})])
你可以使用double 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)
在這里,老運動:
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
您可以創建另一個傳遞dictionary
框,其中keys
作為列名稱, values
dm
。 然后,您可以連接兩個數據幀:
df2 = pd.DataFrame({'A': dm, 'B': dm, 'C': dm})
con = (df, df2)
df3 = pd.concat(con)
我想我找到了答案。
dm3 = pd.DataFrame(dm.values[:, None].repeat(df.shape[1], axis=1),
dm.index, df.columns)
df.append(dm3)
查看有問題的更新時間。 這種解決方案在較大規模下更好地提供。 我不能接受這個答案2天。 我仍然願意接受更好的解決方案。
大致相同,可能取決於規模? 如果你可以在不轉換為數據幀的情況下插入它會更快...索引將是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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.