簡體   English   中英

pandas將相同的系列追加到每一列

[英]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

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 repeatnumpy.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM