Новый фрейм данных, состоящий из уникальных значений разных фреймов данных - PullRequest
2 голосов
/ 16 октября 2019

У меня есть два фрейма данных:

df1 = 
a   b
1   555
2   555
4   555
4   555
5   555
6   555
7   555
8   555
15  555
1   555

И

df2 = 
a   b
2   666
2   666
3   666
4   666
5   666
2   666
3   666
9   666

Я хочу найти одинаковые значения столбца a между двумя фреймами данных и поместить их в новый фрейм данных(также со значениями других столбцов. Здесь b) Требуемый вывод:

df3 = 
    a   b
    2   555
    2   666
    2   666
    4   555
    4   555
    4   666
    …

И т. д.

Я попытался:

df3= pd.merge(df1, df2, on=['a'], how='inner')

но это дает мне что-то другое

Ответы [ 3 ]

3 голосов
/ 16 октября 2019

Использование:

df3= pd.concat([df1, df2], ignore_index=True)
df3 = df3[df3['a'].isin(np.intersect1d(df1['a'], df2['a']))]

Или:

idx = np.intersect1d(df1['a'], df2['a'])
df3 = pd.concat([df1[df1.a.isin(idx)], df2[df2.a.isin(idx)]], ignore_index=True)

print (df3)
   a    b
1  2  555
2  4  555
3  4  555
4  5  555
0  2  666
1  2  666
3  4  666
4  5  666
5  2  666
1 голос
/ 16 октября 2019

Грубо, это решит вашу проблему:

(pd.concat((df1[df1.a.isin(df2.a)],
            df2[df2.a.isin(df1.a)]),
           ignore_index=True)
    .sort_values('a'))

#   a    b
#0  2  555
#4  2  666
#5  2  666
#8  2  666
#1  4  555
#2  4  555
#6  4  666
#3  5  555
#7  5  666
0 голосов
/ 16 октября 2019

Это мало чем отличается от других решений

set1 = set(df1["a"].tolist())
set2 = set(df2["a"].tolist())
inter = list(set1.intersection(set2))

df3 = pd.concat([df1[df1["a"].isin(inter)],
                 df2[df2["a"].isin(inter)]],
                  ignore_index=True)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...