Я заинтересован в создании строки, состоящей из данных строки и столбца pandas. Учитывая следующий кадр данных pandas, меня интересует только генерация строки из столбцов с положительными значениями
index A B C
1 0 1 2
2 0 0 3
3 0 0 0
4 1 0 0
Я хотел бы создать новый столбец, который добавляет строку, которая перечисляет, какие столбцы в строке были положительными. Затем я бы сбросил все строки, из которых поступали данные:
index Positives
1 B-1, C-2
2 C-3
4 A-1
Вот один из способов использования pd.DataFrame.apply
+ pd.Series.apply
:
df = pd.DataFrame([[1, 0, 1, 2], [2, 0, 0, 3], [3, 0, 0, 0], [4, 1, 0, 0]],
columns=['index', 'A', 'B', 'C'])
def formatter(x):
x = x[x > 0]
return (x.index[1:].astype(str) + '-' + x[1:].astype(str))
df['Positives'] = df.apply(formatter, axis=1).apply(', '.join)
print(df)
index A B C Positives
0 1 0 1 2 B-1, C-2
1 2 0 0 3 C-3
2 3 0 0 0
3 4 1 0 0 A-1
Если вам нужно отфильтровать строки нулевой длины, вы можете использовать тот факт, что пустые строки оцениваются False
с помощью bool
:
res = df[df['Positives'].astype(bool)]
print(res)
index A B C Positives
0 1 0 1 2 B-1, C-2
1 2 0 0 3 C-3
3 4 1 0 0 A-1
Я бы заменил нули np.NaN
чтобы удалить вещи, которые вам не np.NaN
и stack
. Затем сформируйте groupby.apply(list)
строки и groupby.apply(list)
import numpy as np
df = df.set_index('index') # if 'index' is not your index.
stacked = df.replace(0, np.NaN).stack().reset_index()
stacked['Positives'] = stacked['level_1'] + '-' + stacked[0].astype(int).astype('str')
stacked = stacked.groupby('index').Positives.apply(list).reset_index()
stacked
теперь:
index Positives
0 1 [B-1, C-2]
1 2 [C-3]
2 4 [A-1]
Или, если вам просто нужна одна строка, а не список, измените последнюю строку:
stacked.groupby('index').Positives.apply(lambda x: ', '.join(list(x))).reset_index()
# index Positives
#0 1 B-1, C-2
#1 2 C-3
#2 4 A-1
DataFrame
он создает мультииндекс, с именами столбцов в качестве одного из уровней индекса. .reset_index()
избавляется от multIndex, который оставляет столбец с именем level_1
котором указано имя столбца, из которого level_1
ненулевое значение. Другой столбец с меткой 0
содержит все ненулевые значения.