Найти вхождение на основе значений индекса в pandas - PullRequest
0 голосов
/ 30 марта 2020

У меня есть таблица, подобная следующей, учитывая наличие nan:

    A       B       C       D
0   4.0     85.0    85.0    2.0
1   34.0    89.0    89.0    7.0
2   100     99.0    99.0    10.0
3   148.0   100.0   100.0   27.0
4   nan     103.0   nan     30.0

Что я хочу, чтобы получить все уникальные числа из таблицы, для которых я использовал

itertools.chain(*[df[j].unique().tolist() for j in df.columns])

, который даст мне все уникальные значения в df. Теперь реальная проблема заключается в том, что я хочу получить что-то вроде следующего:

id  A  B  C  D
2   0  0  0  1
4   1  0  0  0
7   0  0  0  1
10  0  0  0  1
27  0  0  0  1
30  0  0  0  1
34  1  0  0  0
...
85  0  1  1  0
89  0  1  1  0
100 1  1  1  0

Есть ли способ сделать это?

Ответы [ 3 ]

3 голосов
/ 30 марта 2020

Используйте get_dummies с DataFrame.stack, получайте maximal значений на второй уровень, переименовывайте имена столбцов для приведения к целым числам и последней транспонирования:

df = pd.get_dummies(df.stack()).max(level=1).rename(columns=int).T
print (df)
     A  B  C  D
2    0  0  0  1
4    1  0  0  0
7    0  0  0  1
10   0  0  0  1
27   0  0  0  1
30   0  0  0  1
34   1  0  0  0
85   0  1  1  0
89   0  1  1  0
99   0  1  1  0
100  1  1  1  0
103  0  1  0  0
148  1  0  0  0
2 голосов
/ 30 марта 2020

Использование Series.duplicated с keep=False:

s=df.stack()
new_df = (pd.concat([s, s.duplicated(keep=False)],axis=1)
            .set_index(0,append=True)[1]
            .unstack(1, fill_value=False)
            .droplevel(None)
            .astype(int)

Мы также можем использовать melt + pivot_table

df2 = df.melt()
new_df = (df2.assign(dup=df2['value'].duplicated(keep=False))
             .pivot_table(index='value',
                          columns='variable',
                          values='dup',
                          fill_value=False)
             .astype(int))
0 голосов
/ 30 марта 2020

Я также реализовал следующие, которые также решают цель.

pd.get_dummies(df.melt()).dropna(how='any')\
            .groupby('value').sum()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...