python - 在 pandas 中创建新列以存储单独的值
问题描述
ID onevalue twovalue
ABC 0.568 0.004
ABC 5.620 -2.514
ABC -1.551 -0.452
LMN 14.56 7.456
LMN 6.750 2.896
LMN 5.620 1.166
LMN 8.640 3.486
基于上面的数据框,我有以下功能:
cond = (df.onevalue > df.twovalue)
df['S'] = np.where(cond, df.onevalue,"")
这很好用,并在新的“S”数据框/系列上为我提供了适当的“单值”。
我现在要做的是我希望它创建多个“S”列,并为给定的“ID”在每列中放置一个“onevalue”变量。出现新 ID 后,列生成应该重新开始,并且重复的值不应该计算在内。为了澄清起见,这是一个预期的结果:
ID onevalue twovalue S S1 S2
ABC 0.568 0.004 0.568
ABC 5.620 -2.514 5.620
ABC -1.551 -0.452
LMN 14.56 7.456 14.56
LMN 6.750 2.896 6.750
LMN 5.620 1.166
LMN 8.640 3.486 8.640
不确定 pandas 是否允许未定义的列创建,如果是这种情况,我们可以假设每个 ID 最多 7 列。
我一直在努力解决它,但没有运气。一点帮助将不胜感激。
谢谢!
解决方案
ID
是的,您可以在和 unstack中枚举具有相对顺序的行:
df.join(pd.DataFrame({'S':np.maximum(df.onevalue, df.twovalue),
'idx': df.groupby('ID').cumcount()})
.set_index('idx',append=True)['S']
.unstack('idx').fillna('').add_prefix('S')
)
输出:
ID onevalue twovalue S0 S1 S2 S3
0 ABC 0.568 0.004 0.568
1 ABC 5.620 -2.514 5.62
2 ABC -1.551 -0.452 -0.452
3 LMN 14.560 7.456 14.56
4 LMN 6.750 2.896 6.75
5 LMN 5.620 1.166 5.62
6 LMN 8.640 3.486 8.64
推荐阅读
- c++ - 防止用户输入会导致整数溢出的值
- php - 使用 PHP 自动增加数组值
- c# - dotnet-sonarscanner - 后处理失败 - “找不到或加载主类”
- kubernetes - Istio 服务及其使用
- java - Gradle 有没有办法使用 curl 命令解决依赖关系?
- android - 在签名的调试应用程序中测试订阅时出错
- c# - 在 Windows 机器上的 .net 中使用 C#,有没有办法确定特定应用程序正在使用或打开的 tcp 或 udp 端口?
- reactjs - 将 HTML/CSS/JS Mapbox 文件转换为 React
- react-native - 如何检测 React Native 应用程序中的视图溢出?
- ios - 可执行文件使用无效权利签名 [AIR]