[英]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.