pandas - 熊猫以价值观为中心
问题描述
给定一个数据框
df=pd.DataFrame([[1,11,0],[1,12,1],[2,21,0],[2,22,1]])
df.columns = ['Key','Value','PivotOn']
pivoted = df.pivot(index='Key',columns='PivotOn',values='Value')
枢轴操作将为我提供“PivotOn”列中的第 0 列和第 1 列。但我想始终以值 0、1 和 2 为中心,即使可能不存在 PivotOn = 2 的行(只需为其生成 nan )。
我无法修改原始数据框,所以我想要类似的东西:
pivoted = df.pivot(index='Key',columns=[0,1,2],values='Value')
它总是会产生 0、1 和 2 的 3 列,并且第 2 列充满了 nan。
解决方案
假设PivotOn
具有三个唯一值0, 1, 2
df=pd.DataFrame([[1,11,0],[1,12,1],[2,21,0],[2,22,2]])
df.columns = ['Key','Value','PivotOn']
df
+---+-----+-------+---------+
| | Key | Value | PivotOn |
+---+-----+-------+---------+
| 0 | 1 | 11 | 0 |
| 1 | 1 | 12 | 1 |
| 2 | 2 | 21 | 0 |
| 3 | 2 | 22 | 2 |
+---+-----+-------+---------+
并说您需要包括第 2、3 和 4 列(您也可以假设 2 可能存在也可能不存在于 original 中df
,因此进行概括)
然后去 -
expected = {2, 3, 4}
res = list(expected - set(df.PivotOn.unique()))
if len(res) > 1:
new_df = pd.DataFrame({'Key':np.NaN, 'Value':np.NaN, 'PivotOn':res}, index=range(df.shape[0], df.shape[0] + len(res)))
ndf = pd.concat([df, new_df], sort=False)
pivoted = ndf.pivot(index='Key',columns='PivotOn',values='Value').dropna(how='all')
else:
pivoted = df.pivot(index='Key',columns='PivotOn',values='Value')
pivoted
+---------+------+------+------+-----+-----+
| PivotOn | 0 | 1 | 2 | 3 | 4 |
+---------+------+------+------+-----+-----+
| Key | | | | | |
| 1.0 | 11.0 | 12.0 | NaN | NaN | NaN |
| 2.0 | 21.0 | NaN | 22.0 | NaN | NaN |
+---------+------+------+------+-----+-----+
推荐阅读
- javascript - 有没有办法在数组中获取复选框的选中值?[反应]
- reactjs - 类型 '(props: Props) => Element' 不可分配给类型 'FunctionComponent
>' 与 React-final-form - perl - 如果每个字段没有使用 sed/awk/perl 用引号括起来,则为每个字段添加引号
- node.js - 如何解决“这可能不是 npm 的问题。上面可能有额外的日志输出”?
- cocoa - 在 NSAttributedString 中用另一个替换 NSColor
- android - Android打印机,纸张出来但不打印
- excel - 在 VB 中通过 RefreshAllStatisticData 出错
- java - 带有分页、排序和规范的 JPA
- python-3.x - Dask分布式工作人员无响应
- python - Python:如何查看是否打印了所有行?