【发布时间】:2019-11-12 08:29:22
【问题描述】:
假设我们有以下简化数据:
df = pd.DataFrame({'A':list('abcd'),
'B':list('efgh'),
'Data_mean':[1,2,3,4],
'Data_std':[5,6,7,8],
'Data_corr':[9,10,11,12],
'Text_one':['foo', 'bar', 'foobar', 'barfoo'],
'Text_two':['bar', 'foo', 'barfoo', 'foobar'],
'Text_three':['bar', 'bar', 'barbar', 'foofoo']})
A B Data_mean Data_std Data_corr Text_one Text_two Text_three
0 a e 1 5 9 foo bar bar
1 b f 2 6 10 bar foo bar
2 c g 3 7 11 foobar barfoo barbar
3 d h 4 8 12 barfoo foobar foofoo
我想枚举具有相同前缀的列。在这种情况下,前缀是Data, Text。所以预期输出将是:
A B Data_mean1 Data_std2 Data_corr3 Text_one1 Text_two2 Text_three3
0 a e 1 5 9 foo bar bar
1 b f 2 6 10 bar foo bar
2 c g 3 7 11 foobar barfoo barbar
3 d h 4 8 12 barfoo foobar foofoo
注意枚举列。
尝试的解决方案 #1:
def enumerate_cols(dataframe, prefix):
cols = []
num = 1
for col in dataframe.columns:
if col.startswith(prefix):
cols.append(col + str(num))
num += 1
else:
cols.append(col)
return cols
enumerate_cols(df, 'Data')
['A',
'B',
'Data_mean1',
'Data_std2',
'Data_corr3',
'Text_one',
'Text_two',
'Text_three']
尝试的解决方案 #2:
[c+str(x+1) for x, c in enumerate([col for col in df.columns if col.startswith('Data')])]
['Data_mean1', 'Data_std2', 'Data_corr3']
问题:有没有更简单的解决方案,我也查看了df.filter(like='Data') 等。但这看起来也很牵强。
XY 问题
请确保我没有落入XY problem。我想使用pd.wide_to_long,但是stubnames 列需要以数字为后缀才能融合数据框。
引用自文档:
对于存根名称 [‘A’, ‘B’],此函数期望找到一组或多组格式为 A-suffix1, A-suffix2,..., B-suffix1, B-suffix2, 的列
pd.wide_to_long(df, stubnames=['Data', 'Text'], i=['A', 'B'], j='grp', sep='_')
这会返回一个空数据框。
【问题讨论】:
-
您的问题是仅限于两个前缀“数据”和“文本”还是应该概括?另外,A 和 B 应该是索引吗?
-
Q1:是的,前缀的数量会很少(主要是 2 或 3 个),因此不必一概而论。 Q2:如果你愿意,你可以将它们设置为索引,现在没关系。 @cs95
-
请问一个问题,从数据结构层面,最后加1到n是多余的,为什么要这样做
-
当然@WeNYoBen,但我不确定我是否理解正确,你指的是代码的哪一部分?
-
我的意思是这个问题,只是好奇为什么要在末尾添加数字计数