Как напечатать заголовки столбцов, если значения строк больше, чем среднее значение (или медиана) столбца.

Например, df = а б в г 0 12 11 13 45 1 6 13 12 23 2 5 12 6 35

the output should be 0: a, c, d. 1: a, b, c. 2: b.
1
Ram 30 Авг 2017 в 00:09

4 ответа

Лучший ответ
In [22]: df.gt(df.mean()).T.agg(lambda x: df.columns[x].tolist())
Out[22]:
0    [a, c, d]
1       [b, c]
2          [d]
dtype: object

Или же:

In [23]: df.gt(df.mean()).T.agg(lambda x: ', '.join(df.columns[x]))
Out[23]:
0    a, c, d
1       b, c
2          d
dtype: object
3
MaxU 29 Авг 2017 в 21:25

Вы можете попробовать это с помощью pandas, я разбиваю шаги

df=df.reset_index().melt('index')
df['MEAN']=df.groupby('variable')['value'].transform('mean')
df[df.value>df.MEAN].groupby('index').variable.apply(list)

Out[1016]: 
index
0    [a, c, d]
1       [b, c]
2          [d]
Name: variable, dtype: object
2
YOBEN_S 29 Авг 2017 в 21:15

Используйте df.apply, чтобы сгенерировать маску, которую затем можно будет повторить и проиндексировать в df.columns:

mask = df.apply(lambda x: x >  x.mean())
out = [(i, ', '.join(df.columns[x])) for i, x in mask.iterrows()]
print(out)
[(0, 'a, c, d'), (1, 'b, c'), (2, 'd')]
1
cs95 29 Авг 2017 в 21:14
d = defaultdict(list)
v = df.values
[d[df.index[r]].append(df.columns[c])
 for r, c in zip(*np.where(v > v.mean(0)))];
dict(d)

{0: ['a', 'c', 'd'], 1: ['b', 'c'], 2: ['d']}
1
piRSquared 29 Авг 2017 в 21:40