我有一个这样的数据帧:
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。
谢谢你的帮助。
试试这个,idxmax
与series.where
和df.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
您可以通过检查True
的index
轻松完成此操作。您必须知道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)))