我有以下数据: (此处提供的数据仅是代表性数据)
我要对这些数据执行以下操作:
我只想在201之后获得列 即我想删除200-1至200-4列数据。 一种方法是在从excel读取数据时仅检索所需的列,但我想知道如何根据特定模式过滤列名称,因为200-1至200-4列名称具有模式200-*
我想在202-4之后创建一列,该列以下列方式存储值:
201q1 =(201-1和201-2)的平均值
类似地,如果将有202-1至201-4数据存在,则应该形成类似的列。
请帮助。
预先感谢您的支持。
答案 0 :(得分:0)
这是一个粗略的例子,但它会让您接近。该示例假定每个组始终有四列:
#sample data
np.random.seed(1)
df = pd.DataFrame(np.random.randn(2,12), columns=['200-1','200-2','200-3','200-4', '201-1', '201-2', '201-3','201-4', '202-1', '202-2', '202-3','202-4'])
# remove 200-* columns
df2 = df[df.columns[~df.columns.str.contains('200-')]]
# us np.arange to create groups
new = df2.groupby(np.arange(len(df2.columns))//2, axis=1).mean()
# rename columns
new.columns = [f'{v}{k}' for v,k in zip([x[:3] for x in df2.columns[::2]], ['q1','q2']*int(len(df2.columns[::2])/2))]
# join
df2.join(new)
201-1 201-2 201-3 201-4 202-1 202-2 202-3 \
0 0.865408 -2.301539 1.744812 -0.761207 0.319039 -0.249370 1.462108
1 -0.172428 -0.877858 0.042214 0.582815 -1.100619 1.144724 0.901591
202-4 201q1 201q2 202q1 202q2
0 -2.060141 -0.718066 0.491802 0.034834 -0.299016
1 0.502494 -0.525143 0.312514 0.022052 0.702043
答案 1 :(得分:0)
对于第1步,您可以使用列表理解和熊猫放置功能:
dropcols = [x for x in df.columns if '200-' in x]
df.drop(dropcols, axis=1, inplace=True)
第3步和第4步相似,您可以计算列的滚动平均值:
df2 = df.rolling(2, axis = 1).mean() # creates rolling mean
df2.columns = [x.replace('-', 'q') for x in df2.columns] # renames the columns
dfans = pd.concat([df, df2], axis = 1) # concatenate the columns together
现在,您只需要删除不需要的列并将其重命名。