我有以下熊猫数据框:
ColA ColB Code Value
FALSE FALSE J060 FALSE
FALSE FALSE J010 FALSE
FALSE TRUE J030 TRUE
FALSE FALSE J111 FALSE
TRUE TRUE Z290 FALSE
FALSE FALSE B340 TRUE
TRUE FALSE B340 FALSE
FALSE TRUE B340 FALSE
列 ColA、ColB 和 Value 是布尔列。我想创建一个具有相同行数的新数据框,以便将布尔列的信息转换为字符串:
Code BooleanInformation
J060
J010
J030 ColB,Value
J111
Z290 ColA,ColB
B340 Value
B340 ColA
B340 ColB
代码列应保持不变。当第一个数据框中出现 TRUE 值时,应将列名(ColA、ColB 或 Value)插入到第二个数据框中的字符串中。
答案 0 :(得分:1)
使用 DataFrame.set_index
作为来自 Code
列的索引,然后使用 DataFrame.dot
矩阵乘以所有没有 Code
和分隔符的列,删除分隔符并将系列转换为 {{1} }:
DataFrame
仅选择布尔列的替代方法:
df1 = (df.set_index('Code')
.dot(df.columns.drop('Code') + ',')
.str[:-1]
.reset_index(name='BooleanInformation'))
df1 = (df.set_index('Code')
.dot(df.select_dtypes(bool).columns + ',')
.str[:-1]
.reset_index(name='BooleanInformation'))
答案 1 :(得分:1)
你可以尝试这样的事情。
import pandas as pd
df = pd.read_csv('example.txt')
df[['ColA', 'ColB', 'Value']].astype(bool)
df['BooleanInformation'] = df.apply(lambda row: ','.join([column for column in df.columns if row[column] and column !='Code']), axis=1)
df.drop(df.columns[[0,1,3]], axis=1, inplace=True)
print(df)