Python pandas транспонировать сумасшедший контент - PullRequest
2 голосов
/ 19 марта 2020

Я хочу преобразовать это:

df = pd.DataFrame({
    'Filter 1': ['False','False','False','False'],
    'Filter 2': ['True','False','False','True'],
    'Filter 3': ['True','True','True','True']
})
print(df)

  Filter 1 Filter 2 Filter 3
----------------------------
0    False     True     True
1    False    False     True
2    False    False     True
3    False     True     True

В это:

result = pd.DataFrame({
    'Filter': ['Filter 1', 'Filter 2', 'Filter 3'],
    'True': [0,2,4],
    'False': [4,2,0]
})
print(result)

     Filter  True  False
------------------------
0  Filter 1     0      4
1  Filter 2     2      2
2  Filter 3     4      0

Можете ли вы помочь мне? Это traspose + count значения, которые я не могу исправить, ни найти

С уважением!

Ответы [ 3 ]

4 голосов
/ 19 марта 2020

Это количество значений:

df.apply(pd.Series.value_counts).fillna(0).T

Вывод:

          False  True
Filter 1    4.0   0.0
Filter 2    2.0   2.0
Filter 3    0.0   4.0
3 голосов
/ 19 марта 2020

Вот один из них, использующий stack и groupby.value_counts:

df.stack().groupby(level=1).value_counts().unstack(fill_value=0)

            False  True 
Filter 1      4      0
Filter 2      2      2
Filter 3      0      4
3 голосов
/ 19 марта 2020

Мы также можем использовать DataFrame.melt + pd.crosstab:

df2 = df.melt(var_name='Filter')
pd.crosstab(df2['Filter'], df2['value'], colnames=[None]).reset_index()

     Filter  False  True
0  Filter 1      4     0
1  Filter 2      2     2
2  Filter 3      0     4
...