使用 pandas 操作数据帧时,创建新列并根据在数据帧中查找现有数据用值填充它们



给定数据

df = pd.DataFrame(
{
'c': ['p1', 'p2', 'p3'],
'v': [ 2  ,  8  ,  3],
}
)

这输出

c  v  
0  p1  2   
1  p2  8   
2  p3  3   

我想知道如何使用熊猫创建以下内容

c  v  p1  p2  p3
0  p1  2   2   0   0
1  p2  8   0   8   0
2  p3  3   0   0   3

这样我就可以将其扩展到 1000 行而不是 3 行(因此没有硬编码(

编辑

我目前的方法如下:

df = pd.DataFrame(
{
'c': ['p1', 'p2', 'p3'],
'v': [ 2  ,  8  ,  3],
}
)
# create columns with zero 
for p in df['c']:
df[p] = 0
# iterate over columns, set values 
for p in df['c']:
# get value
value = df.loc[ df.loc[:,'c']==p, 'v']
# get the location of the element to set
idx=df.loc[:,'c']==p
df.loc[idx,p]=value

输出正确的结果,我觉得这是一种非常笨拙的方法。

编辑二

该解决方案必须适用于以下数据:

df = pd.DataFrame(
{
'c': ['p1', 'p2', 'p3', 'p1'],
'v': [ 2  ,  8  ,  3, 4],
}
)

返回

c  v  p1  p2  p3
0  p1  2   2   0   0
1  p2  8   0   8   0
2  p3  3   0   0   3
3  p1  9   9   0   0

这意味着使用数据透视表的方法作为

piv = df.pivot_table(index='c', columns='c', values='v', fill_value=0)
df = df.join(piv.reset_index(drop=True))

行不通,尽管对于原始数据集来说很好。

get_dummies创建的多指标数据帧,列vDataFrame.join原始:

df1 = df.join(pd.get_dummies(df["c"]).mul(df['v'], axis=0))
print (df1)
c  v  p1  p2  p3
0  p1  2   2   0   0
1  p2  8   0   8   0
2  p3  3   0   0   3

编辑:

df1 = df.join(pd.get_dummies(df["c"]).mul(df['v'], axis=0))
print (df1)
c  v  p1  p2  p3
0  p1  2   2   0   0
1  p2  8   0   8   0
2  p3  3   0   0   3
3  p1  4   4   0   0

详情

#indicator column
print (pd.get_dummies(df["c"]))
p1  p2  p3
0   1   0   0
1   0   1   0
2   0   0   1
3   1   0   0
#all values are multiple by c column
print (pd.get_dummies(df["c"]).mul(df['v'], axis=0))
p1  p2  p3
0   2   0   0
1   0   8   0
2   0   0   3
3   4   0   0

使用

  • pd.get_dummies()- 将分类变量转换为虚拟/指示变量。

  • df.join()- 联接另一个数据帧的列。

前任。

import pandas as pd
df = pd.DataFrame(
{
'c': ['p1', 'p2', 'p3'],
'v': [ 2  ,  8  ,  3],
}
)
s = pd.get_dummies(df["c"])
s.values[s != 0] = df['v']
df = df.join(s)
print(df)

操作/操作:

c  v  p1  p2  p3
0  p1  2   2   0   0
1  p2  8   0   8   0
2  p3  3   0   0   3

您可以使用 numpy 矩阵。

n = df['c'].shape[0]
t = np.zeros(shape=(n, n)).astype(np.int)
np.fill_diagonal(t, df['v'])    
t = pd.DataFrame(t, columns = df['c'])
df = pd.concat([df,t], axis=1)

DF:

c   v   p1  p2  p3
0   p1  2   2   0   0
1   p2  8   0   8   0
2   p3  3   0   0   3

使用pivot_table

piv = df.pivot_table(index='c', columns='c', values='v', fill_value=0)
df = df.join(piv.reset_index(drop=True))

输出

c  v  p1  p2  p3
0  p1  2   2   0   0
1  p2  8   0   8   0
2  p3  3   0   0   3

最新更新