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

时间:2016-07-03 07:38:09

标签: python pandas

考虑数据框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的每一列。我希望结果看起来像:

enter image description here

此外,由于这将大规模应用,时间至关重要。

我用来生成预期输出的是:

pd.concat([df, pd.DataFrame({c: dm for c, i in df.iteritems()})])

时间(小规模)

enter image description here

时间(大规模)

enter image description here

5 个答案:

答案 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 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)

答案 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)

您可以创建另一个数据框,其中dictionarykeys作为列名,valuesdm。然后,您可以连接两个数据帧:

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