Python 更改每个特定列的列值

Python 更改每个特定列的列值,python,pandas,dataframe,Python,Pandas,Dataframe,我正在玩一个大的数据集,几乎有200列和70000行。这是一个如此混乱的数据,所以我应该让更多的可读性 在数据列中,是指: ATT_A(同意),ATT_SA(强烈同意),ATT_D(不同意)等等 每5列仅代表一个答案 我的想法是,我可以使用.replace()函数,然后使每1个值列表示一个值(如果列名是..那么列值应该是'SA'而不是1) 然后我可以在一列中连接5列。这样就不会那么凌乱了 思想专栏 SA A SD A D SA 这是我试过的代码 for c in cols.columns:

我正在玩一个大的数据集,几乎有200列和70000行。这是一个如此混乱的数据,所以我应该让更多的可读性

在数据列中,是指:
ATT_A(同意)
ATT_SA(强烈同意)
ATT_D(不同意)
等等

每5列仅代表一个答案

我的想法是,我可以使用
.replace()
函数,然后使每1个值列表示一个值(如果列名是..那么列值应该是
'SA'
而不是1)

然后我可以在一列中连接5列。这样就不会那么凌乱了

思想专栏

SA
A
SD
A
D
SA
这是我试过的代码

for c in cols.columns:
    if c.upper()[:4] == 'ATT_':
        if c[-2:] == 'SA':
             c.replace('1', 'SA')
我试了很多次,但我看不出我的错误。 我对编码是新手,所以我可能会犯愚蠢的错误。

这里有一个选项:

# split the columns at the second underscore to make the columns a multi-index
df.columns = df.columns.str.rsplit("_", n=1, expand=True)    

# transform the answer A,SA,D... to a column, group by level 0(row number) and find out the
# answer corresponding to 1 with idxmax
df.stack(level=1).groupby(level=0).agg(lambda x: x.idxmax()[1])


另一种选择:


数据设置:


你能做一个小的可复制的例子,用易于复制和粘贴的文本替换图像吗?我改变了图片,希望现在更清晰。我很想分享csv.example,但我不能这么做。对不起。你能在文本中显示你的数据框的一些比例吗(复制和粘贴)?例如
df.filter(regex=“TECHIMP”).head()
。只是想知道那些列中不是1的值是什么。0还是NaN?我希望我明白了。这里是一个TECHIMP:
ATT\u TECHIMP\u a 0 NaN 1 NaN 2 NaN 3 NaN 4 1.0
ATT\u TECHIMP\u D 0 1.0 1.0 NaN 3 NaN 4 NaN
# split columns as above
df.columns = df.columns.str.rsplit("_", n=1, expand=True)    

# group columns based on the prefix along axis 1, and for each row find out the index with 
# value 1 using idxmax() function
df.groupby(level=0, axis=1).apply(lambda g: g.apply(lambda x: x.idxmax()[1], axis = 1))
cols1 = ["ATT_TECHIMP_" + x for x in ["SA", "A", "NO", "D", "SD"]]
cols2 = ["ATT_BBB_" + x for x in ["SA", "A", "NO", "D", "SD"]]

df1 = pd.DataFrame([[1, None, None, None, None], [None, None, 1, None, None], [None, None, 1, None, None], [None, None, None, 1, None], [None, None, None, None, 1]], columns=cols1)
df2 = pd.DataFrame([[None, 1, None, None, None], [None, None, None, None, 1], [None, None, 1, None, None], [None, None, None, 1, None], [None, None, None, None, 1]], columns=cols2)

df = pd.concat([df1, df2], axis=1)