有没有办法通过将现有数据框的一列乘以其余列来快速创建新数据框

时间:2016-11-07 03:02:08

标签: pandas dataframe

我有以下数据框(假设我有更多列):

   m a b
t1 1 1 2
t2 2 1 2
t3 3 1 2

我希望将列m与元素ab逐个元素相乘,并返回以下数据框:

   a b
t1 1 2
t2 2 4
t3 3 6

目前我首先将列m转换为向量。只是想知道是否有人有更直接的方式?

1 个答案:

答案 0 :(得分:0)

我认为你需要mul

如果a只需要多个bm列:

print (df[['a','b']].mul(df.m, axis=0))
    a  b
t1  1  2
t2  2  4
t3  3  6

如果列m是第一个,您可以选择所有列,而不是先iloc,然后选择多个:

print (df.iloc[:, 1:])
    a  b
t1  1  2
t2  1  2
t3  1  2

df = df.iloc[:, 1:].mul(df.m, axis=0)
print (df)
    a  b
t1  1  2
t2  2  4
t3  3  6

更一般地说,列表理解不是m的过滤列:

cols = [col for col in df.columns if col !='m']
print (cols)
['a', 'b']

df = df[cols].mul(df.m, axis=0)
print (df)
    a  b
t1  1  2
t2  2  4
t3  3  6

<强>计时

#[300000 rows x 2 columns]
df = pd.concat([df]*100000).reset_index(drop=True)

In [438]: %timeit (df[['a','b']].mul(df.m, axis=0))
100 loops, best of 3: 5.41 ms per loop

In [439]: %timeit (df.iloc[:, 1:].mul(df.m, axis=0))
100 loops, best of 3: 2.66 ms per loop

In [440]: %timeit (df[['a','b']].apply(lambda x: x*df.m))
100 loops, best of 3: 10.3 ms per loop