Фрейм данных Pandas JOIN / MERGE / CONCAT по определенным показателям - PullRequest
1 голос
/ 18 октября 2019

Я хочу объединить два индекса данных конкретных кадров в соответствии с картой (dictionary), которую я создал. Какой эффективный способ сделать это?

Данные:

df = pd.DataFrame({"a":[10, 34, 24, 40, 56, 44], 
                    "b":[95, 63, 74, 85, 56, 43]}) 

print(df)

    a   b
0  10  95
1  34  63
2  24  74
3  40  85
4  56  56
5  44  43


df1 = pd.DataFrame({"c":[1, 2, 3, 4], 
                   "d":[5, 6, 7, 8]}) 

print(df1)
   c  d
0  1  5
1  2  6
2  3  7
3  4  8

d = { 
    (1,0):0.67,
    (1,2):0.9,
    (2,1):0.2,
    (2,3):0.34
    (4,0):0.7,
    (4,2):0.5
}

Желаемый результат:

  a  b  c  d  ratio
0 34 63 1  5  0.67
1 34 63 3  7  0.9
...
5 56 56 3  7  0.5

Я могу добиться этого, но это занимает много времени, так как карта моих исходных фреймов данных содержит около 4,7 млн ​​строк. Я хотел бы знать, есть ли способ MERGE, JOIN или CONCAT этих фреймов данных по различным индексам.

Мой подход:

matched_rows = []
for key in d.keys():                                              
    s = df.iloc[key[0]].tolist() + df1.iloc[key[1]].tolist() + [d[key]]
    matched_rows.append(s)

df_matched = pd.DataFrame(matched_rows, columns = df.columns.tolist() + df1.columns.tolist() + ['ratio']

Буду очень признателен за вашу помощь. Заранее большое спасибо.

1 Ответ

2 голосов
/ 18 октября 2019

Создайте Series, а затем DaatFrame на dictioanry, DataFrame.join и удалите оба первых столбца по позициям:

df = (pd.Series(d).reset_index(name='ratio')
        .join(df, on='level_0')
        .join(df1, on='level_1')
        .iloc[:, 2:])
print (df)
   ratio   a   b  c  d
0   0.67  34  63  1  5
1   0.90  34  63  3  7
2   0.20  24  74  2  6
3   0.34  24  74  4  8
4   0.70  56  56  1  5
5   0.50  56  56  3  7

, а затем при необходимости измените порядокстолбцы:

df = df[df.columns[1:].tolist() + df.columns[:1].tolist()]
print (df)
    a   b  c  d  ratio
0  34  63  1  5   0.67
1  34  63  3  7   0.90
2  24  74  2  6   0.20
3  24  74  4  8   0.34
4  56  56  1  5   0.70
5  56  56  3  7   0.50
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...