给定数据
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
创建的多指标数据帧,列v
并DataFrame.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