【问题标题】:Moving pandas series value by switching column name?通过切换列名来移动熊猫系列值?
【发布时间】: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

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    在frozenset之前使用split(将返回订单列表),然后我们使用join:注意这个解决方案可以应用于更多列

    df.columns=df.columns.str.split('_').map(frozenset).map('_'.join)
    df.mask(df=='NaN').groupby(level=0,axis=1).first() # groupby first will return the first not null value 
       PRED_JAC_W10_IND
    0                 1
    1                 2
    2                 1
    3                 2
    4                 1
    5                 2
    

    【讨论】:

    • 谢谢!有没有办法让它返回原始正确的列名(W10_JAC_IND_PRED)?不幸的是,我有数百列采用这种格式
    猜你喜欢
    • 1970-01-01
    • 2020-03-17
    • 2018-02-17
    • 1970-01-01
    • 2018-08-21
    • 1970-01-01
    • 1970-01-01
    • 2016-05-28
    • 1970-01-01
    相关资源
    最近更新 更多