Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将多个DataFrame列压缩为Pandas中的单个指示符列_Python_Pandas_Dataframe_Group By - Fatal编程技术网

Python 将多个DataFrame列压缩为Pandas中的单个指示符列

Python 将多个DataFrame列压缩为Pandas中的单个指示符列,python,pandas,dataframe,group-by,Python,Pandas,Dataframe,Group By,假设我有一个如下所示的数据帧: import pandas as pd import numpy as np d = {'ID': [1,2,3,4], 'name': ['bob','shelby','jordan','jeff'], 'type1': [1,1,0,0], 'type2':[1,0,1,0], 'type4':[1,0,0,0], 'type5':[0,0,1,0], 'type6':[0,1,0,0],

假设我有一个如下所示的数据帧:

import pandas as pd
import numpy as np

d = {'ID': [1,2,3,4], 
     'name': ['bob','shelby','jordan','jeff'],
     'type1': [1,1,0,0],
     'type2':[1,0,1,0],
     'type4':[1,0,0,0],
     'type5':[0,0,1,0],
     'type6':[0,1,0,0],
     'type8':[0,0,1,0]}
df: pd.DataFrame = pd.DataFrame(data=d)
print(df.head(9))

   ID    name  type1  type2  type4  type5  type6  type8
0   1     bob      1      1      1      0      0      0
1   2  shelby      1      0      0      0      1      0
2   3  jordan      0      1      0      1      0      1
3   4    jeff      0      0      0      0      0      0
我想将“type5”、“type6”和“type8”列压缩为一个称为“其他”的列,并将任何“1”指标聚合为新的“其他”列中的“1”。因此,如果“jordan”有一个“other”列条目,那么他应该有一个“1”指示符,因为他在type6和type8中有一个“1”(因此对每个选定的列(type5、type6、type8)跨行使用max()操作)

所需的框架应类似于:

   ID    name  type1  type2  type4  other 
0   1     bob      1      1      1      0     
1   2  shelby      1      0      0      1      
2   3  jordan      0      1      0      1      
3   4    jeff      0      0      0      0     
我需要为要压缩的列创建一个布尔掩码,然后在它们之间聚合以创建新列,同时删除旧列。我如何才能做到这一点?

在这里尝试您的逻辑

drop_cols = ['type5','type6','type8']

df = (df.assign(other=df[drop_cols].max(1))  # new column with max value
        .drop(columns=drop_cols)             # drop the old columns
     )
输出:

   ID    name  type1  type2  type4  other
0   1     bob      1      1      1      0
1   2  shelby      1      0      0      1
2   3  jordan      0      1      0      1
3   4    jeff      0      0      0      0

使用
any

df['other'] = df.loc[:, ['type5','type6','type8']].any(axis=1).astype(int)
df = df.drop(['type5','type6','type8'], axis=1)
结果:

   ID    name  type1  type2  type4  other
0   1     bob      1      1      1      0
1   2  shelby      1      0      0      1
2   3  jordan      0      1      0      1
3   4    jeff      0      0      0      0

很好的回答!谢谢。很好的回答,这很有效。谢谢。