Создайте столбцы с одинаковым внутренним диапазоном из разных информационных кадров в Pandas - PullRequest
0 голосов
/ 24 апреля 2020

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

Df1:
ID         Line    ...      Sta
19805       120    ...       30
19805       120    ...       40
19805       123    ...       30
    .       .       .         .
    .       .       .         .
19841       120    ...        30

Df2:
 ID         Line     ...      Sta
19805       122      ...       30
19805       119      ...       41
19805       123      ...       30
    .        .       .          .
    .        .       .          .
19841        120      ...      33

Я хотел бы добавить два столбца в Df2 с одинаковыми столбцами Df1, используя ближайшее совпадение с Df1

Df2:
 ID         Line     ...      Sta   linedf1   stadf1
19805       122      ...       30      120        30
19805       119      ...       41      120        40
19805       123      ...       30      123        30
    .        .        .         .       .         .
    .        .        .         .       .         .
19841        120      ...      33       120       30

обратите внимание, что совпадение должно быть внутри диапазона Df2 ["Line"] + - 4 и Df2 ["Sta"] + - 4

Поэтому я попробовал это:

Df1["line"].where((Df2['line']-4)<=Df1["line"]) & (Df1["line"]<=(Df2['line']+4)

Df1.loc[((Df2['line']-4)<=Df1["line"]) & ((Df1["line"]<=(Df2['line']+4))]

Df1[Df1["line"].between((Df2['line']-4),(Df2['line']+4), inclusive= True)]

но все они приводят к этой ошибке

ValueError: Can only compare identically-labeled Series objects

У кого-нибудь есть идеи, как этого добиться? надеюсь, этот вопрос не слишком расплывчатый

1 Ответ

0 голосов
/ 24 апреля 2020

Использовать DataFrame.merge первое:

df = df2.merge(df1, on='ID', suffixes=('', 'df1'))
df = df[df["Line"].between((df['Linedf1']-4),(df['Linedf1']+4), inclusive= True)]
print (df)
      ID  Line  Sta  Linedf1  Stadf1
0  19805   122   30      120      30
1  19805   122   30      120      40
2  19805   122   30      123      30
3  19805   119   41      120      30
4  19805   119   41      120      40
5  19805   119   41      123      30
6  19805   123   30      120      30
7  19805   123   30      120      40
8  19805   123   30      123      30
9  19841   120   33      120      30

Одним из возможных решений является обработка порциями, по N строк, создание множества DataFrames и последнего объединения:

#change to 10000 or 100000 in real data
N = 3
dfs = []
for g, df11 in df1.groupby(np.arange(len(df1.index)) // N):
    df = df2.merge(df11, on='ID', suffixes=('', 'df1'))
    df = df[df["Line"].between((df['Linedf1']-4),(df['Linedf1']+4), inclusive= True)]
    #print (df)
    dfs.append(df)

dfout = pd.concat(dfs, ignore_index=True)
print (dfout)
      ID  Line  Sta  Linedf1  Stadf1
0  19805   122   30      120      30
1  19805   122   30      120      40
2  19805   122   30      123      30
3  19805   119   41      120      30
4  19805   119   41      120      40
5  19805   119   41      123      30
6  19805   123   30      120      30
7  19805   123   30      120      40
8  19805   123   30      123      30
9  19841   120   33      120      30
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...