繁体   English   中英

如何根据python 2.7中的条件转置特定列

[英]How to transpose specific columns based on a condition in python 2.7

我的文件中包含以下数据格式:

ID,var_name,var_value
1,ABC,This is abc1
1,DEF,This is def1
2,ABC,This is abc2
2,DEF,This is def2
2,GHI,This is ghi2
3,ABC,This is abc3
4,ABC,This is abc4
4,DEF,This is def4

我也有标题列表= ['ABC','GHI']

在上述数据集中,每个“ ID”不一定具有所有变量,但是ID:2包含最大数量的变量(ABC,DEF,GHI)。 我需要将上述数据集转换为以下嵌套列表格式:

[['ID','ABC','GHI'], [1,'This is abc1', ''],[2, 'This is abc2','This is ghi2'],[3,'This is abc3',''],[4,'This is abc4','']]

这意味着该列表应:

  • 填充所有ID的数据
  • 为上述数据集中不存在的变量创建空字符串。
  • 填充嵌套列表,并保持与标题列表相同的顺序
  • 仅填充那些标头值,即标头列表仅包含值“ ABC”,“ GHI”,因此嵌套列表应仅填充值“ ABC”和“ GHI”,并且应忽略上述数据集中的“ DEF”行。

我想在Python 2.7中做到这一点,可能使用Pandas。

我认为您应该尝试留在这个美丽的熊猫的数据框中

df2=(df.pivot(index='ID', columns='var_name', values='var_value')
     .fillna('').drop('DEF', axis=1).reset_index())



#output:
var_name  ID           ABC           GHI
0          1  This is abc1              
1          2  This is abc2  This is ghi2
2          3  This is abc3              
3          4  This is abc4                

但您也可以进一步实现此列表:

print([df2.columns.tolist()] + df2.values.tolist())

[['ID', 'ABC', 'GHI'], 
[1, 'This is abc1', ''], 
[2, 'This is abc2', 'This is ghi2'], 
[3, 'This is abc3', ''], 
[4, 'This is abc4', '']]

采用:

L = ['ABC','GHI']

df1 = df.pivot('ID', 'var_name', 'var_value').fillna('')[L].reset_index()
print (df1)
var_name  ID           ABC           GHI
0          1  This is abc1              
1          2  This is abc2  This is ghi2
2          3  This is abc3              
3          4  This is abc4     

L1 = [df1.columns.tolist()] + df1.values.tolist()
print (L1)

[['ID', 'ABC', 'GHI'], 
 [1, 'This is abc1', ''], 
 [2, 'This is abc2', 'This is ghi2'],
 [3, 'This is abc3', ''], 
 [4, 'This is abc4', '']]

说明

  1. 第一pivot ,取代NaN S按fillna ,转换子集用于过滤列和从通过索引创建列reset_index
  2. 最后创建嵌套列表和最后插入列的名称

编辑:

我尝试更改列表中值的顺序:

L = ['GHI', 'ABC']
df1 = df.pivot('ID', 'var_name', 'var_value').fillna('')[L].reset_index()
print (df1)
var_name  ID           GHI           ABC
0          1                This is abc1
1          2  This is ghi2  This is abc2
2          3                This is abc3
3          4                This is abc4

L1 = [df1.columns.tolist()] + df1.values.tolist()
print (L1)

[['ID', 'GHI', 'ABC'],
 [1, '', 'This is abc1'], 
 [2, 'This is ghi2', 'This is abc2'], 
 [3, '', 'This is abc3'], 
 [4, '', 'This is abc4']]

另外,您可以设置一个multiindex并进行unstack

In []:
L = ['ABC', 'GHI']
df = df.set_index(['ID', 'var_name'])['var_value'].unstack(fill_value='')[L].reset_index()
df

Out[]:
var_name  ID           ABC           GHI
0          1  This is abc1              
1          2  This is abc2  This is ghi2
2          3  This is abc3              
3          4  This is abc4              

In []:
[df.columns.tolist()] + df.values.tolist()

Out[]:
[['ID', 'ABC', 'GHI'],
 [1, 'This is abc1', ''],
 [2, 'This is abc2', 'This is ghi2'],
 [3, 'This is abc3', ''],
 [4, 'This is abc4', '']]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM