[英]Filling in blanks on a DataFrame with numbered variables - Python Pandas
我有一个 DataFrame 的格式:
ID Theme Operation Volume
100 Jungle S3 Full
200 Desert S3 Full
302 Cavern S1 Empty
303 Swamp nan Full
400 Jungle S3 nan
600 Desert nan Empty
我想编写一个脚本来遍历空单元格并从“nan”重新分配它们,并用变量 NA_ 替换它们,其中 _ 是它们缺少变量的计数。 所以我想要的 output 是:
ID Theme Operation Volume
100 Jungle S3 Full
200 Desert S3 Full
302 Cavern S1 Empty
303 Swamp NA1 Full
400 Jungle S3 NA3
600 Desert NA2 Empty
当我尝试遍历 df 并识别 nan 值时,出于某种原因,以下内容无效。
count = 0
for col in df.colums:
for row in df[col]:
if row == float('nan'):
row = 'NA{}'.format(count)
count += 1
任何想法为什么? 或者有没有更好的方法来做到这一点,我很难看到?
谢谢:)
连接您的列,将 NaN 替换为 NA_(_ 替换为num
)并拆分您的列。 最后将修改后的列覆盖为原始 dataframe:
tmp = df.reset_index().melt(id_vars='index', value_vars=['Operation', 'Volume'])
num = (tmp['value'].isna().cumsum()).astype(int)
tmp['value'] = tmp['value'].fillna('NA' + num.astype(str))
tmp = tmp.pivot(index='index', columns='variable', values='value')
df[tmp.columns] = tmp
>>> df
ID Theme Operation Volume
0 100 Jungle S3 Full
1 200 Desert S3 Full
2 302 Cavern S1 Empty
3 303 Swamp NA1 Full
4 400 Jungle S3 NA3
5 600 Desert NA2 Empty
有点困难,但并非不可能。
重要的是在对column
进行排序时创建层次结构 --> index
以根据值是否为 NA 创建每列的累积和。 基本上您不希望在操作之前计算 Volume NA 值。
s = df.stack(dropna=False).reset_index()
s['level_1'] = pd.Categorical(s['level_1'],categories=df.columns.tolist())
s1 = s.sort_values(by=['level_1','level_0']).set_index(['level_0','level_1']
).isna().cumsum().unstack(1).droplevel(0,1)
df = df.fillna('NA_' + s1.astype(str))
ID Theme Operation Volume
0 100 Jungle S3 Full
1 200 Desert S3 Full
2 302 Cavern S1 Empty
3 303 Swamp NA_1 Full
4 400 Jungle S3 NA_3
5 600 Desert NA_2 Empty
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.