python panda: вернуть индексы общих строк - PullRequest
0 голосов
/ 12 мая 2018

Извинения, если это довольно новый вопрос. Я пытался найти, какие строки являются общими для двух фреймов данных. Возвращаемые значения должны быть индексами строк df2, которые являются общими с df1. Мой неуклюжий пример:

df1 = pd.DataFrame({'col1':['cx','cx','cx2'], 'col2':[1,4,12]})
df1['col2'] = df1['col2'].map(str);
df2 = pd.DataFrame({'col1':['cx','cx','cx','cx','cx2','cx2'], 'col2':[1,3,5,10,12,12]})
df2['col2'] = df2['col2'].map(str);

df1['idx'] = df1[['col1','col2']].apply(lambda x: '_'.join(x),axis=1);
df2['idx'] = df2[['col1','col2']].apply(lambda x: '_'.join(x),axis=1);

df1['idx_values'] = df1.index.values
df2['idx_values'] = df2.index.values

df3 = pd.merge(df1,df2,on = 'idx');
myindexes = df3['idx_values_y'];

myindexes.to_csv(idir + 'test.txt',sep='\t',index = False);

Возвращаемые значения должны быть [0,4,5]. Было бы здорово сделать это эффективно, так как два кадра данных будут иметь несколько миллионов строк.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 12 мая 2018

Новый столбец со значениями объединения необязателен, объединить по умолчанию внутреннее объединение по обоим столбцам и, если необходимо, значения df2.index добавить reset_index:

df1 = pd.DataFrame({'col1':['cx','cx','cx2'], 'col2':[1,4,12]})
df2 = pd.DataFrame({'col1':['cx','cx','cx','cx','cx2','cx2'], 'col2':[1,3,5,10,12,12]})

df3 = pd.merge(df1,df2.reset_index(), on = ['col1','col2'])
print (df3)
  col1 col2  index
0   cx    1      0
1  cx2   12      4
2  cx2   12      5

Для обоихдля индексов необходимо:

df4 = pd.merge(df1.reset_index(),df2.reset_index(), on = ['col1','col2'])
print (df4)

   index_x col1  col2  index_y
0        0   cx     1        0
1        2  cx2    12        4
2        2  cx2    12        5

Только для пересечения обоих фреймов данных:

df5 = pd.merge(df1,df2, on = ['col1','col2'])
#if 2 column DataFrame   
#df5 = pd.merge(df1,df2)
print (df5)

  col1  col2
0   cx     1
1  cx2    12
2  cx2    12
0 голосов
/ 12 мая 2018

Это легко сделать, объединив (внутреннее объединение) оба кадра данных:

common_rows = pd.merge(df1, df2.reset_index(), how='inner', on=['idx_values'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...