我有一个巨大的数据框,里面有值和空白/ NA。我想从数据框中删除空格,并在列中向上移动下一个值。考虑下面的示例数据框。
import pandas as pd import numpy as np df = pd.DataFrame(np.random.randn(5,4)) df.iloc[1,2] = np.NaN df.iloc[0,1] = np.NaN df.iloc[2,1] = np.NaN df.iloc[2,0] = np.NaN df 0 1 2 3 0 1.857476 NaN -0.462941 -0.600606 1 0.000267 -0.540645 NaN 0.492480 2 NaN NaN -0.803889 0.527973 3 0.566922 0.036393 -1.584926 2.278294 4 -0.243182 -0.221294 1.403478 1.574097
我希望我的输出如下
0 1 2 3 0 1.857476 -0.540645 -0.462941 -0.600606 1 0.000267 0.036393 -0.803889 0.492480 2 0.566922 -0.221294 -1.584926 0.527973 3 -0.243182 1.403478 2.278294 4 1.574097
我希望删除NaN,然后将下一个值上移。df.shift没有帮助。我尝试了多个循环和if语句,并获得了预期的结果,但是还有什么更好的方法可以完成它。
df.shift
你可以用apply与dropna:
apply
dropna
np.random.seed(100) df = pd.DataFrame(np.random.randn(5,4)) df.iloc[1,2] = np.NaN df.iloc[0,1] = np.NaN df.iloc[2,1] = np.NaN df.iloc[2,0] = np.NaN print (df) 0 1 2 3 0 -1.749765 NaN 1.153036 -0.252436 1 0.981321 0.514219 NaN -1.070043 2 NaN NaN -0.458027 0.435163 3 -0.583595 0.816847 0.672721 -0.104411 4 -0.531280 1.029733 -0.438136 -1.118318 df1 = df.apply(lambda x: pd.Series(x.dropna().values)) print (df1) 0 1 2 3 0 -1.749765 0.514219 1.153036 -0.252436 1 0.981321 0.816847 -0.458027 -1.070043 2 -0.583595 1.029733 0.672721 0.435163 3 -0.531280 NaN -0.438136 -0.104411 4 NaN NaN NaN -1.118318
然后,如果需要替换为空白空间,则创建混合值(带数字的字符串)的某些函数可能会被破坏:
df1 = df.apply(lambda x: pd.Series(x.dropna().values)).fillna('') print (df1) 0 1 2 3 0 -1.74977 0.514219 1.15304 -0.252436 1 0.981321 0.816847 -0.458027 -1.070043 2 -0.583595 1.02973 0.672721 0.435163 3 -0.53128 -0.438136 -0.104411 4 -1.118318