【发布时间】:2019-01-15 00:57:31
【问题描述】:
我有一个 DF,但是某些系列的最后一个值应该放在另一个系列中。发生这种情况是由于列名未标准化 - 即,有些是“Wx_y_x_PRED”,有些是“Wx_x_y_PRED”。我很难编写一个函数来简单地找到 >= 225 NaN 的列并更改它分配到的列。
我编写了一个函数,由于某种原因,它有时可以工作,有时不能。当它这样做时,它会进一步创建大约 850 列(OG 数据帧大约为 420 列,其中包含重复的列)。我希望有一些东西可以重新分配价值。如果它会自动删除不正确的列,那也很棒,但是当我的函数最初工作时,我只是使用了 .dropna(thresh = 2) 。
这是它最初的样子:
in: df = pd.DataFrame(data = {'W10_IND_JAC_PRED': ['NaN','NaN','NaN','NaN','NaN',2],
'W10_JAC_IND_PRED': [1,2,1,2,1,'NAN']})
out:df
W10_IND_JAC_PRED W10_JAC_IND_PRED
0 NaN 1
1 NaN 2
2 NaN 1
3 NaN 2
4 NaN 1
W 2 NAN
我写了这个,它偶尔会起作用,但大多数时候不起作用,我不知道为什么。
def switch_cols(x):
"""Takes mismatched columns (where only the last value != NaN) and changes order of team column names"""
if x.isna().sum() == 5:
col_string = x.name.split('_')
col_to_switch = ('_').join([col_string[0],col_string[2],col_string[1],'PRED'])
df[col_to_switch]['row_name'] = x[-1]
else:
pass
return x
大多数时候它只是返回给我完全相同的 DF,但这是预期的结果。
W10_IND_JAC_PRED W10_JAC_IND_PRED
0 NaN 1
1 NaN 2
2 NaN 1
3 NaN 2
4 NaN 1
W 2 2
任何人有任何提示或可以分享为什么我的功能可能在 10% 的时间内有效?
编辑:
所以这是我写的一个丑陋的“for”循环,它有效。不过,我知道在保留原始列名的同时必须有一种更 Pythonic 的方式来做到这一点。
for i in range(df.shape[1]):
if df.iloc[:,i].isna().sum() == 5:
split_nan_col = df.columns[i].split('_')
correct_col_name = ('_').join([split_nan_col[0],split_nan_col[2],split_nan_col[1],split_nan_col[3]])
df.loc[5,correct_col_name] = df.loc[5,df.columns[i]]
else:
pass
【问题讨论】: