Подсчет кол-ва ненулевых значение в столбцах DataFrame с сохранением результатов в ту же таблицу посредством однострочного выражения
Как можно посредством однострочного выражения подсчитать кол-во не нулевых значений в столбцах и результы записать в те же столбцы вместо ненулевых значений?
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
sns.set()
d = {
7:{"c1":5, "c2":8, "c3":10},
5:{"c1":1, "c2":7, "c3":10},
4:{"c1":1, "c2":6, "c3":8},
3:{"c1":4, "c2":7, "c3":9},
2:{"c1":3, "c2":5, "c3":6},
1:{"c1":2, "c2":7, "c3":9}
}
df = pd.DataFrame(d).T
r = (df
.stack()
.reset_index(name="col")
.assign(x=1)
.pivot_table(index="level_0", columns="col", values="x")
.reindex(range(1,11), axis=1)
.fillna(0)
.astype("int8")
.rename_axis(None)
.rename_axis(None, axis=1))
print(r)
Текущий результат
1 2 3 4 5 6 7 8 9 10
1 0 1 0 0 0 0 1 0 1 0
2 0 0 1 0 1 1 0 0 0 0
3 0 0 0 1 0 0 1 0 1 0
4 1 0 0 0 0 1 0 1 0 0
5 1 0 0 0 0 0 1 0 0 1
7 0 0 0 0 1 0 0 1 0 1
Ожидаемый результат
1 2 3 4 5 6 7 8 9 10
1 0 1 0 0 0 0 3 0 2 0
2 0 0 1 0 2 2 0 0 0 0
3 0 0 0 1 0 0 3 0 2 0
4 2 0 0 0 0 2 0 2 0 0
5 2 0 0 0 0 0 3 0 0 2
7 0 0 0 0 2 0 0 2 0 2
Ответы (1 шт):
Автор решения: strawdog
→ Ссылка
import pandas as pd
d = {
7:{"c1":5, "c2":8, "c3":10},
5:{"c1":1, "c2":7, "c3":10},
4:{"c1":1, "c2":6, "c3":8},
3:{"c1":4, "c2":7, "c3":9},
2:{"c1":3, "c2":5, "c3":6},
1:{"c1":2, "c2":7, "c3":9}
}
df = pd.DataFrame(d).T
print(df)
r = (df
.stack()
.reset_index(name="col")
.assign(x=1)
.pivot_table(index="level_0", columns="col", values="x")
.reindex(range(1,11), axis=1)
.fillna(0)
.astype("int8")
.rename_axis(None)
.rename_axis(None, axis=1)).apply(lambda x: x*sum(x))
print(r)
1 2 3 4 5 6 7 8 9 10
1 0 1 0 0 0 0 3 0 2 0
2 0 0 1 0 2 2 0 0 0 0
3 0 0 0 1 0 0 3 0 2 0
4 2 0 0 0 0 2 0 2 0 0
5 2 0 0 0 0 0 3 0 0 2
7 0 0 0 0 2 0 0 2 0 2
Если нужен более универсальный вариант (когда ненулевые значения в датафрейме не обязательно равны 1, то последний apply лучше записать так:
.apply(lambda x: x.astype("bool")*sum(x.astype("bool")))