Jestem świadomy podobne pytania zostały wcześniej zadawane (Jak scalić dwa Wiersze w pandas Dataframe itp.), Ale nadal walczę, aby wykonać następujące czynności (z wyjątkiem pandas Dataframe z wieloma rzędami):

    team_token  day1    day2   day3  day4
0   abc          1      NaN     NaN   NaN
1   abc          NaN     1      NaN   NaN
2   abc          NaN     NaN    NaN    NaN
3   abc          NaN     NaN    NaN     1

Chcę połączyć wiersze z tym samym team_Token tak, że wynik końcowy wygląda:

    team_token  day1    day2  day3  day4
0   abc           1      1    NaN     1

Z góry dziękuję.

4
cgp25 28 czerwiec 2017, 12:56

3 odpowiedzi

Najlepsza odpowiedź

Użyj combine_first na dwóch {x1}} podane przez dwa rzędy Dataframe:

import pandas as pd
df = pd.DataFrame({'team_token':['abc', 'abc'], 'day1': [1, None], 'day2' : [None, 1]})

df.loc[0].combine_first(df.loc[1])

Daje:

 team_token  day1    day2
0   abc           1       1 

#Edit: Lepsze rozwiązanie, które działa również z zaktualizowaną odpowiedzią, jest po prostu:

df.max()

Zakładając, że kolumny day zawierają nan lub te.

Jeśli masz inny team_tokens:

   day1  day2  day3 team_token
0   1.0   NaN   NaN        abc
1   NaN   NaN   NaN        abc
2   1.0   1.0   NaN        abc
3   NaN   NaN   NaN        abc
4   1.0   NaN   1.0        ddd
5   1.0   NaN   1.0        ddd
6   NaN   NaN   1.0        ddd

Możesz group_by i nadal bierzesz max grupy:

df.groupby('team_token').max().reset_index()

#  team_token  day1  day2  day3
#0        abc   1.0   1.0   NaN
#1        ddd   1.0   NaN   1.0
4
VinceP 2 wrzesień 2020, 07:59

Może, nie najkrótsze rozwiązanie, ale imho bardziej elastyczne.

import pandas as pd
import numpy as np

df = pd.DataFrame({'team_token':['abc', 'abc', 'abc', 'abc'], 
                   'day1': [1, None, None, None], 
                   'day2': [None, 1, None, None],
                   'day3': [None, None, None, None],
                   'day4': [None, None, None, 1]})
df

enter image description here

def replace_nan_func(x):
    x = x[~pd.isna(x)]
    if len(x) > 0:
        return x.iloc[0]
    else:
        return np.NaN

df_valid = df.groupby(by='team_token').agg(dict.fromkeys(df.columns[1:], replace_nan_func))
df_valid

enter image description here

0
Kirill Dolmatov 3 lipiec 2019, 14:26

Jeśli istnieje tylko jedna wartość non-Nan dla każdego zespołu_tokenowego, możesz użyć Groupby / sum

df.groupby('team_token')['day1', 'day2'].sum().reset_index()

Dostajesz

    team_token  day1    day2
0   abc         1.0     1.0
0
Vaishali 28 czerwiec 2017, 10:24