Как найти повторяющиеся значения и соответствующие значения в новых столбцах - PullRequest
0 голосов
/ 21 января 2020

У меня есть такой фрейм данных, где страна и имя, где бы оно ни было уникально для того же идентификатора, должны быть в новых столбцах.

enter image description here

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

enter image description here

Пробовал с кодом ниже, но работает штрафа за один столбец, что если у меня есть 2 столбца вместе и выполнить ту же задачу.

group = df.groupby('ID')
df1 = group.apply(lambda x:x['COUNTRY'].unique())
df1=df1.apply(pd.Series)

Ответы [ 2 ]

2 голосов
/ 21 января 2020

Вы можете сделать следующее,

# Create a dataframe where each element is aggregated as list
new_df = df.groupby('ID').agg(lambda x: pd.Series(x).unique().tolist())

# Generate column names to be used after expanding lists
country_cols = ['Country_'+str(i) for i in range(new_df["Country"].str.len().max())]
name_cols = ['Name_'+str(i) for i in range(new_df["Name"].str.len().max())]

# Drop the Country, Name columns from the original and expand Country, Name columns and concat that to the original dataframe, finally do a fillna
df2 = pd.concat(
    [new_df.drop(['Country','Name'], axis=1), 
     pd.DataFrame.from_records(new_df["Country"], columns=country_cols, index=new_df.index),
     pd.DataFrame.from_records(new_df["Name"], columns=name_cols, index=new_df.index)
     ], axis=1
     ).fillna(' ')

1 голос
/ 21 января 2020

Мы можем сделать это с помощью простой функции:

def unique_column_unstack(dataframe,agg_columns):
    dfs = []
    for col in agg_columns:
        agg_df = df.groupby('ID')[col].apply(lambda x : pd.Series(x.unique().tolist())).unstack()        
        agg_df.columns = agg_df.columns.map(lambda x : f"{col}_{x+1}")
        dfs.append(agg_df)
    return pd.concat(dfs,axis=1)

new_df = unique_column_unstack(df,['COUNTRY','NAME'])

print(new_df)

       COUNTRY_1 COUNTRY_2 NAME_1 NAME_2
ID                                      
20_001        US        IN    LIZ    LAK
20_002        US       NaN    LIZ   CHRI
20_003        US        EU    LIZ    NaN
20_004        EU       NaN   CHRI    NaN   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...