我有一个数据文件,例如:
Groups COL1 COL2 COL3 COL4
G1 A NaN I J
G1 A NaN I J
G1 NaN NaN Z J
G1 B K Z J
G2 NaN NaN NaN NaN
G2 NaN NaN K NaN
G3 NaN B C D
G3 NaN C C D
G3 NaN B C E我想:
1-首先,对于每个Group和Column,都要获得一个协商一致的列,例如:
Groups COL1 COL2 COL3 COL4 cc_COL1 cc_COL2 cc_COL3 cc_COL4
G1 A NaN I J A K I J
G1 A NaN I J A K I J
G1 NaN NaN Z J A K Z J
G1 B K Z J A K Z J
G2 NaN NaN NaN NaN NaN NaN K NaN
G2 NaN NaN K NaN NaN NaN K NaN
G3 NaN B C D NaN B C D
G3 NaN C C D NaN B C D
G3 NaN B C E NaN B C D当Group和column中的两个值具有相同的数字时,我取第一个。
第二步,为每个组获得一个representaitve_column:
其中,该列按以下列的顺序接受non-NaN值:
cc_COL1,cc_COL2,cc_COL3 and cc_COL4因此,例如,如果cc_COL1中有NaN,则representative_column接受cc_COL2的值,但是如果cc_COL2在NaN,中也使用cc_COL3等值,直到cc_COL4为止。如果都是NaN,那我就把NaN。
然后,在这个例子中,我应该得到以下输出:
Groups COL1 COL2 COL3 COL4 cc_COL1 cc_COL2 cc_COL3 cc_COL4 representative_column
G1 A NaN I J A K I J A
G1 A NaN I J A K I J A
G1 NaN NaN Z J A K Z J A
G1 B K Z J A K Z J A
G2 NaN NaN NaN NaN NaN NaN K NaN K
G2 NaN NaN K NaN NaN NaN K NaN K
G3 NaN B C D NaN B C D B
G3 NaN C C D NaN B C D B
G3 NaN B C E NaN B C D B以下是dict格式的数据格式(如果可以帮助的话):
{'Groups': {0: 'G1', 1: 'G1', 2: 'G1', 3: 'G1', 4: 'G2', 5: 'G2'}, 'COL1': {0: 'A', 1: 'A', 2: nan, 3: 'B', 4: nan, 5: nan}, 'COL2': {0: nan, 1: nan, 2: nan, 3: 'K', 4: nan, 5: nan}, 'COL3': {0: 'I', 1: 'I', 2: 'Z', 3: 'Z', 4: nan, 5: 'K'}, 'COL4 ': {0: 'J', 1: 'J', 2: 'J', 3: 'J', 4: nan, 5: nan}}发布于 2021-12-23 17:48:46
试试这个:
tmp_df = df.apply(lambda col: col.groupby(df['Groups']).transform(lambda x: x.mode()[0] if len(x.mode())>0 else np.nan)).drop('Groups', axis=1)
df['representative_column'] = tmp_df.bfill(axis=1).iloc[:, 0]输出:
>>> df
Groups COL1 COL2 COL3 COL4 cc_COL1 cc_COL2 cc_COL3 cc_COL4 representative_column
0 G1 A NaN I J A K I J A
1 G1 A NaN I J A K I J A
2 G1 NaN NaN Z J A K I J A
3 G1 B K Z J A K I J A
4 G2 NaN NaN NaN NaN NaN NaN K NaN K
5 G2 NaN NaN K NaN NaN NaN K NaN K
6 G3 NaN B C D NaN B C D B
7 G3 NaN C C D NaN B C D B
8 G3 NaN B C E NaN B C D Bhttps://stackoverflow.com/questions/70465644
复制相似问题