Ich habe einen Pandas-Datenrahmen wie folgt:

data = {'A'      :[1,2,3], 
        'B':[2,17,17], 
        'C1'     :["C1",np.nan,np.nan],
       'C2'     :[np.nan,"C2",np.nan]} 

# Create DataFrame 
df = pd.DataFrame(data) 
df


    A   B   C1  C2
0   1   2   C1  NaN
1   2   17  NaN C2
2   3   17  NaN NaN

Ich möchte eine Variable "C" basierend auf "C1" und "C2" erstellen (es könnte "C4", "C5" geben. Wenn eines von C den Wert "C" = Wert von C hat (C1, C2, C3) ....). Meine Ausgabe sollte in diesem Fall wie folgt aussehen:

    A   B   C1  C2   C
0   1   2   C1  NaN  C1
1   2   17  NaN C2   C2
2   3   17  NaN NaN  NaN
1
Shanoo 8 Feb. 2020 im 01:02

3 Antworten

Beste Antwort

Versuche dies

df1 = df.filter(regex='^C\d+')
df['C'] = df1[df1.isin(df1.columns)].bfill(1).iloc[:,0]

Out[117]:
   A   B   C1   C2    C
0  1   2   C1  NaN   C1
1  2  17  NaN   C2   C2
2  3  17  NaN  NaN  NaN

Wenn Sie Werte, die mit dem eigenen Spaltennamen übereinstimmen, streng vergleichen möchten, verwenden Sie eq anstelle von isin wie folgt

df['C'] = df1[df1.eq(df1.columns, axis=1)].bfill(1).iloc[:,0]
3
Andy L. 7 Feb. 2020 im 22:49

IIUC

df['C']=df.filter(like='C').bfill(axis=1).iloc[:,0]
df
   A   B   C1   C2    C
0  1   2   C1  NaN   C1
1  2  17  NaN   C2   C2
2  3  17  NaN  NaN  NaN
1
YOBEN_S 7 Feb. 2020 im 22:58

IIUC,

Wir können Ihre Spalten nach dem Wort C filtern und dann die Werte mit einem agg -Aufruf aggregieren:

df['C'] = df.filter(regex='C\d+').stack().groupby(level=0).agg(','.join)

print(df)

   A   B   C1   C2    C
0  1   2   C1  NaN   C1
1  2  17  NaN   C2   C2
2  3  17  NaN  NaN  NaN
0
Datanovice 7 Feb. 2020 im 22:52