簡體   English   中英

循環或迭代 DataFrame 中的列以替換 null 值

[英]Loop or iterate through columns in a DataFrame to replace null values

我有一個 dataframe 是 762106 行 x 79 列。 有 14 個“集合”,每列表示給定特征的不同“強度”級別,每列表示給定特征的不同級別,而 NaN 表示另一列中有值。 它們已經編碼,我想將它們壓縮成一列,這樣我就有 14 列而不是 42 列。

可以像這樣重新創建子集:

import pandas as pd
import numpy as np    
df = pd.DataFrame([[np.nan, 2, np.nan, 1, np.nan, np.nan, np.nan, np.nan, 3],
                    [1, np.nan, np.nan, np.nan, 2, np.nan, 1, np.nan, np.nan],
                    [np.nan, np.nan, 3, 1, np.nan, np.nan, np.nan, 2, np.nan]],
                   columns=['a','aa','aaa','b','bb','bbb','c','cc','ccc'])

Output:

    a       aa      aaa     b       bb      bbb     c       cc      ccc
0   NaN     2.0     NaN     1.0     NaN     NaN     NaN     NaN     3.0
1   1.0     NaN     NaN     NaN     2.0     NaN     1.0     NaN     NaN
2   NaN     NaN     3.0     1.0     NaN     NaN     NaN     2.0     NaN

我希望它們看起來像這樣:

    a   b   c
0   2   1   3
1   1   2   1
2   3   1   2

我目前的解決方案是使用.fillna()從 aa、aaa 等中獲取值,然后使用.drop()刪除多余的列:

df['a'] = df['a'].fillna(df['aa']).fillna(df['aaa'])
df = df.drop(['aa','aaa'],axis = 1)
    
df['b'] = df['b'].fillna(df['bb']).fillna(df['bbb'])
df = df.drop(['bb','bbb'],axis = 1)

這可行,但我想知道是否有更優雅的方法來完成此操作,而無需復制粘貼此代碼塊 14 次。

您可以使用pandas.DataFrame.groupby axis = 1 (“列”):

df.groupby(lambda x: x[0], axis = 1).sum()
     a    b    c
0  2.0  1.0  3.0
1  1.0  2.0  1.0
2  3.0  1.0  2.0

如果 groupby 與 function 一起使用,它會在對象索引的每個值上調用,在這種情況下,是列名。

由於您可以按任何 function 進行分組,因此它可以是一個非常靈活的解決方案。

您可以使用GroupBy.first按列名稱中的第一個字母進行分組:

df = df.groupby(df.columns.str[0], axis=1).first()
print (df)
     a    b    c
0  2.0  1.0  3.0
1  1.0  2.0  1.0
2  3.0  1.0  2.0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM