python - 使用 Pandas 操作数据框,创建新列并根据在数据框中查找现有数据来填充它们的值

标签 python python-3.x pandas dataframe

给定数据

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

这输出

    c  v  
0  p1  2   
1  p2  8   
2  p3  3   

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

    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 创建的多个指标 DataFrame列 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

关于python - 使用 Pandas 操作数据框,创建新列并根据在数据框中查找现有数据来填充它们的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57935194/

相关文章:

python - labelencoder 和 OneHotEncoder 的值错误

python - 如何确定一个wx控件是否被禁用

python - 如何快速获取 dbus 上的所有 VLC 实例?

python - 如何用纯 Python 编写这些方程?

python-3.x - 如何将套接字消息转换为字符串消息

python - 如何在数据框中查找日期时间值的上一行和下一行?

python - pandas 在数据框中找到两条线的交点

python - 具有先前主题词的潜在狄利克雷分配

python - 读取 CSV 文件中的所有列?

python-3.x - 比较和排序 DataFrame 两列中的值并在 python 中的同一行中排序