首页 > 解决方案 > 使用 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))

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

标签: pythonpython-3.xpandasdataframe

解决方案


利用

前任。

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

推荐阅读