столбец для строки в пандах со словарем? - PullRequest
1 голос
/ 15 апреля 2019

У меня есть df следующим образом:

input_data = """
Index U1   P1   ID1    U2   P2  ID2   
0     A    A1   A1_3   D    D1  D1_7
1     A    A1   A1_2   E    E1  E1_4
2     A    A1   A1_1   E    E2  E2_6
3     A    A1   A1_4   F    F1  F1_12
4     B    B1   B1_1   A    A2  A2_1
5     B    B1   B1_2   G    G1  G1_3
6     C    C1   C1_5   H    H1  H1_5
7     A    A1   A1_5   F    F1  F1_3
8     A    A1   A1_1   E    E2  E2_3
"""

Я хочу иметь матричный формат [Порядок матрицы как наиболее повторяющиеся P1 (например, A1)]

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

A   A1  A1_1        A1_2     A1_3    A1_4    A1_5
D   D1                       D1_7
E   E1              E1_4
E   E2  E2_6,E2_3
F   F1                               F1_12   F1_3
A   A2
G   G1
H   H1

1 Ответ

0 голосов
/ 16 апреля 2019

вот решение:

data = """
Index U1   P1   ID1    U2   P2  ID2   
0     A    A1   A1_3   D    D1  D1_7
1     A    A1   A1_2   E    E1  E1_4
2     A    A1   A1_1   E    E2  E2_6
3     A    A1   A1_4   F    F1  F1_12
4     B    B1   B1_1   A    A2  A2_1
5     B    B1   B1_2   G    G1  G1_3
6     C    C1   C1_5   H    H1  H1_5
7     A    A1   A1_5   F    F1  F1_3
8     A    A1   A1_1   E    E2  E2_3
"""


# create the sample dataframe
df = pd.read_csv(pd.compat.StringIO(data), sep='\s+')
df['U1_P1'] = '(' + df['U1'].astype(str) + ',' + df['P1'] + ')'
df['U2_P2'] = '(' + df['U2'].astype(str) + ',' + df['P2'] + ')'
df.drop(['U1', 'U2', 'P1', 'P2'], axis=1, inplace=True)
df = df.groupby(['ID1', 'U2_P2','U1_P1']).ID2.agg([('ID2', ', '.join)]).reset_index()

df_temp = df.groupby(['U1_P1'])['ID1'].agg('count').reset_index()
max_value = df_temp.loc[df_temp['ID1'].idxmax()]['ID1']
df_temp = df_temp[df_temp['ID1'] == max_value].reset_index()

for i, row in df_temp.iterrows():
    u1_p1 = row['U1_P1']
    filter = (df['U1_P1'] == u1_p1)
    dfx = df[filter].groupby(['U1_P1'])['ID1'].apply(list).reset_index()
    cols = [dfx['U1_P1'][0]] + dfx['ID1'][0]
    dfx = df.groupby(['U2_P2', 'ID1']).ID2.max().unstack().reset_index().fillna('').rename(columns={'U2_P2': cols[0]})
    for col in dfx.columns:
        if col not in cols:
            dfx.drop(col, axis=1, inplace=True)

    print(dfx)

output dfx:

ID1  (A,A1)        A1_1  A1_2  A1_3   A1_4  A1_5
0    (A,A2)                                     
1    (D,D1)                    D1_7             
2    (E,E1)              E1_4                   
3    (E,E2)  E2_6, E2_3                         
4    (F,F1)                          F1_12  F1_3
5    (G,G1)                                     
6    (H,H1)  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...