python - Pandas - 仅透视选择行

标签 python pandas

我有一个表,其中两种不同类型的列已堆叠到field 列中 - 属性和问题。

+-------+------------+-------+
|  id   |   field    | value |
+-------+------------+-------+
| 52394 | gender     | M     |
| 52394 | age        | 24    |
| 52394 | question_1 | 2     |
| 52394 | question_2 | 1     |
+-------+------------+-------+

我想 reshape 它,使性别和年龄成为列,而 Question_1 和 Question_2 保持堆叠状态。

+-------+--------+-----+------------+-------+
|  id   | gender | age |   field    | value |
+-------+--------+-----+------------+-------+
| 52394 | M      |  24 | question_1 |     2 |
| 52394 | M      |  24 | question_2 |     1 |
+-------+--------+-----+------------+-------+

关于如何做到这一点有什么想法吗?

最佳答案

这将是我的策略:

将数据透视表应用于您的 df,其中字段为性别或年龄,另存为 df1。选择字段不是性别或年龄的df,保存为df2。然后在 id 上合并两个(df1 和 df2)。这是我的完整代码:

import pandas as pd
import sys
if sys.version_info[0] < 3:
    from StringIO import StringIO
else:
    from io import StringIO

# Create df
rawText = StringIO("""
  id     field     value 
 52394  gender      M     
 52394  age         24    
 52394  question_1  2     
 52394  question_2  1     
""")
df = pd.read_csv(rawText, sep = "\s+")
df1 = df[df['field'].isin(['gender','age'])]
df1 = df1.pivot(index = 'id', columns = 'field', values = 'value').reset_index()
df2 = df[~df['field'].isin(['gender','age'])]
df1.merge(df2)

结果是:

      id age gender       field value
0  52394  24      M  question_1     2
1  52394  24      M  question_2     1

关于python - Pandas - 仅透视选择行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47963769/

相关文章:

python - spect.stack() 返回带有斜杠和反斜杠的路径值

Python 图像库错误 - 渲染 : not enough data 时捕获 IOError

python - 查找 pandas 数据框中列的经度和纬度

python - Pandas Dataframe 删除索引条件为 true 的项目

python - 检查 HDF5 Store 对象是否为空?

python - pandas 在 groupby 级别 2 总和或平均条件上删除行

python - TensorFlow LSTM 预测相同的值

python - 使用设置重新排列 for 循环的顺序

python - 在windows控制台直接运行python脚本

python-3.x - Pandas 滚动窗口获取最小值