如何将多个布尔列转换为具有列标题和NaN的一列



我有一个这样的数据帧:

A      B      C
False  True   False
False  False  False
True   True   False
False  False  True
False  True   False

我需要获得这样的东西:

Total
B  
NaN
A
C
B

我尝试过:

df[["A", "B", "C"]].idxmax(1)

而不是返回NaN,而是返回A代替NaN。

谢谢你的帮助。

试试这个,idxmaxseries.wheredf.any

df.idxmax(1).where(df.any(1))
#or np.where(df.any(1),df.idxmax(1),np.nan)

0      B
1    NaN
2      A
3      C
4      B
dtype: object

只需检查any()是否为

import pandas as pd
import io
import numpy as np
df = pd.read_csv(io.StringIO("""A      B      C
False  True   False
False  False  False
True   True   False
False  False  True
False  True   False"""), sep="s+")
pd.Series(np.where(df.loc[:,["A","B","C"]].any(axis=1), df.loc[:,["A","B","C"]].idxmax(axis=1), np.nan), name="Total")

输出

0      B
1    NaN
2      A
3      C
4      B
Name: Total, dtype: object

您可以通过检查Trueindex轻松完成此操作。您必须知道index可以抛出ValueError

data = '''
A      B      C
False  True   False
False  False  False
True   True   False
False  False  True
False  True   False
'''
def safe_index(arr, val):
try: return arr.index(val)
except ValueError: return -1
def calculate_totals(data):
lines = data.strip().split('n')
keys = lines[0].split()
return list(
map(lambda i: keys[i] if i != -1 else 'NaN',
[safe_index(line.split(), 'True') for line in lines[1:]]))
if __name__ == '__main__':
print('n'.join(['Total'] + calculate_totals(data)))

最新更新