pandas соответствующая база данных со строкой, содержащей индекс базы данных - PullRequest
2 голосов
/ 10 июля 2020

У меня есть база данных со строками и индексом, как показано ниже.

df0
idx name_id_code string_line_0
0 0.01 A
1 0.5 B
2 77.6 C
3 29.8 D
4 56.2 E
5 88.1000005 F
6 66.4000008 G
7 2.1 H
8 99 I
9 550.9999999 J


df1
idx string_line_1
0 A
1 F
2 J
3 G
4 D

Теперь я хочу сопоставить df1 с df0, принимая значения, где df1 = df 0, но сохраняя индекс df0 верно, как показано ниже

df_result name_id_code string_line_0
0 0.01 A
5 88.1000005 F
9 550.9999999 J
6 66.4000008 G
3 29.8 D

Я пробовал с моим кодом, но он не работал для строки и только для индекса соответствия

c = df0['name_id_code'] + ' (' + df0['string_line_0'].astype(str) + ')'
out = df1[df2['string_line_1'].isin(s)]

Я также пытался сохранить простое совпадение только последнего столбца, например

c = df0['string_line_0'].astype(str) + ')'
out = df1[df1['string_line_1'].isin(s)]

но пустой вывод.

Ответы [ 2 ]

1 голос
/ 10 июля 2020

Поскольку фильтруется df0 DataFrame, значения индекса не изменяются, если используется Series.isin на df1['string_line_1', только порядок столбцов такой же, как в исходном df0:

out = df0[df0['string_line_0'].isin(df1['string_line_1'])]
print (out)
     name_id_code string_line_0
idx                            
0        0.010000             A
3       29.800000             D
5       88.100001             F
6       66.400001             G
9      551.000000             J

Или, если использовать DataFrame.merge, то во избежание потери df0.index необходимо добавить DataFrame.reset_index:

out = (df1.rename(columns={'string_line_1':'string_line_0'})
          .merge(df0.reset_index(), on='string_line_0'))
print (out)
  string_line_0  idx  name_id_code
0             A    0      0.010000
1             F    5     88.100001
2             J    9    551.000000
3             G    6     66.400001
4             D    3     29.800000

Аналогичное решение, только те же значения в столбцах string_line_0 и string_line_1:

out = (df1.merge(df0.reset_index(), left_on='string_line_1', right_on='string_line_0'))
print (out)
  string_line_1  idx  name_id_code string_line_0
0             A    0      0.010000             A
1             F    5     88.100001             F
2             J    9    551.000000             J
3             G    6     66.400001             G
4             D    3     29.800000             D
0 голосов
/ 10 июля 2020

Вы можете:

out = df0.loc[(df0["string_line_0"].isin(df1["string_line_1"]))].copy()
out["string_line_0"] = pd.Categorical(out["string_line_0"], categories=df1["string_line_1"].unique())
out.sort_values(by=["string_line_0"], inplace=True)

Первая строка фильтрует df0 только до тех строк, где string_line_0 находится в string_line_1 столбце df1.

вторая строка преобразует string_line_0 в выходном df в категориальную функцию, которая затем настраивается по порядку значений в df1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...