Pandas Merging Dataframe Columns - PullRequest
       6

Pandas Merging Dataframe Columns

1 голос
/ 31 октября 2019

Мои входные данные:

df1

Grp       A       B       C
Men       10      15      14
Women     4       6       5
Baby      3       5       15

df2

Grp       Upper_A    Lower_A       Upper_B    Lower_B       Upper_C   Lower_C
Men       10         1             9          2             15        2
Women     6          4             10         4             10        3
Baby      5          3             15         7             6         3

Желаемый вывод:

Grp      Features    Values   Upper_values  Lower_values    Evaluation
Men      A           10       10            1               True
Men      B           15       9             2               False
Men      C           14       15            2               True
Women    A           4        6             4               True
Women    B           6        10            4               True
Women    C           5        10            6               True
Baby     A           3        5             3               True
Baby     B           5        15            7               False
Baby     C           15       6             3               False

Не могли бы вы помочь мне об этом? PS: столбцы оценки назначаются в зависимости от того, находятся ли они между верхним и нижним значениями.

Ответы [ 2 ]

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

Решение - создать MultiIndex обратно, разделив столбцы и изменить его на DataFrame.stack:

df2.columns = df2.columns.str.split('_', expand=True)

df2 = df2.stack().rename_axis(('Grp','Features'))

Затем обработать df1 таким же образом и создать один столбец DataFrameSeries.to_frame с DataFrame.join секунда df2, последнее использование Series.between для нового столбца:

df1 = df1.rename_axis('Features', axis=1).stack().to_frame('Values')

df = df1.join(df2).reset_index()
df['Evaluation'] = df['Values'].between(df['Lower'], df['Upper'])
print (df)
     Grp Features  Values  Lower  Upper  Evaluation
0    Men        A      10      1     10        True
1    Men        B      15      2      9       False
2    Men        C      14      2     15        True
3  Women        A       4      4      6        True
4  Women        B       6      4     10        True
5  Women        C       5      3     10        True
6   Baby        A       3      3      5        True
7   Baby        B       5      7     15       False
8   Baby        C      15      3      6       False
0 голосов
/ 31 октября 2019

Вы можете использовать melt + кросс-таблица + слияние :

m1 = df1.melt(id_vars=['Grp'])
m2 = df2.melt(id_vars='Grp')

m2[['group', 'variable']] = m2.variable.str.split('_', expand=True)

cross = pd.crosstab(index=[m2['Grp'], m2.variable], columns=m2.group,
                     values=m2['value'], aggfunc='sum').reset_index()

result = m1.merge(cross, on=['Grp', 'variable'])
result['evaluation'] = (result['value'] <= result.Upper) & (result['value'] >= result.Lower)

print(result)

Выход

     Grp variable  value  Lower  Upper  evaluation
0    Men        A     10      1     10        True
1  Women        A      4      4      6        True
2   Baby        A      3      3      5        True
3    Men        B     15      2      9       False
4  Women        B      6      4     10        True
5   Baby        B      5      7     15       False
6    Men        C     14      2     15        True
7  Women        C      5      3     10        True
8   Baby        C     15      3      6       False
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...