python - 使用 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))
行不通,尽管对于原始数据集很好。
解决方案
利用
pd.get_dummies()
- 将分类变量转换为虚拟/指标变量。df.join()
- 加入另一个 DataFrame 的列。
前任。
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
推荐阅读
- sql - PostgreSQL中是否有一个函数可以计算列之间的字符串匹配(按行)
- r - R从S3下载文件
- swiftui - SwiftUI:真实设备显示异步流的奇怪行为,而模拟器完美运行
- c# - 为什么我的查询值在不应该发生变化时会发生变化?
- javascript - 如何将 Django-Template 变量发送到 Morris.Line 数据变量?
- condor - 如何帮助 condor 找到它应该在作业中执行的文件?
- python - 检查 GROUP BY 和列之间的值
- r - 在 R 中使用 reshape 将数据框从长更改为宽。未定义的列错误
- javascript - 如何定期重新渲染反应组件
- c# - C# Selenium 4:设置请求拦截