繁体   English   中英

在多个pandas数据帧上执行列重命名和切片

[英]Perform column rename and slicing on multiple pandas dataframe

import pandas as pd
d = {'col1': [1,"newcolumn1name",5, 8,15 ], 'col2':[5,"newcolumn2name"10,15, 20]}
df = pd.DataFrame(data=d)
df1=df
df2=df

df
Out[24]: 
             col1            col2
0               1               5
1  newcolumn1name  newcolumn2name
2               5              10
3               8              15
4              15              20

我想用这个例子做的是删除第一行并用第二行的字符串重命名列。

我可以使用以下代码完成此操作(完整的python newcomer):

df=df[1:]
new_header = df.iloc[0]
df=df[1:]
df.columns = new_header

df
Out[26]: 
1 newcolumn1name newcolumn2name
2              5             10
3              8             15
4             15             20

现在我希望能够在df1和df2上进行此操作,如示例中所定义。 我已经尝试了列表,词典和地图,但我遇到了所有问题。

谁能想到最简单的方法呢? 根据我的实际数据,我将有六到十个数据帧(~1000x8000)来运行它。

IIUC

l=[df1,df2]

[ d[1:].T.set_index(1).T for d in l]


Out[221]: 
[1 newcolumn1name newcolumn2name
 2              5             10
 3              8             15
 4             15             20, 1 newcolumn1name newcolumn2name
 2              5             10
 3              8             15
 4             15             20]

更新

l=[df1,df2]
df1,df2=[ d[1:].T.set_index(1).T for d in l]
df1
Out[226]: 
1 newcolumn1name newcolumn2name
2              5             10
3              8             15
4             15             20
df2
Out[227]: 
1 newcolumn1name newcolumn2name
2              5             10
3              8             15
4             15             20

更新2

variables = locals()
for x,d in enumerate(l):
    variables["df{0}".format(x+1)]=d[1:].T.set_index(1).T
df1
Out[231]: 
1 newcolumn1name newcolumn2name
2              5             10
3              8             15
4             15             20
df2
Out[232]: 
1 newcolumn1name newcolumn2name
2              5             10
3              8             15
4             15             20

您可以将逻辑转换为函数并使用df.pipe 像下面这样的东西可以工作(未经测试)。

def formatter(df):
    df = df[1:]
    new_header = df.iloc[0]
    df = df[1:]
    df.columns = new_header
    return df

for my_df in [df1, df2, df3, df4, df5, df6]:
    my_df  = my_df.pipe(formatter)

Pandas 0.21+的另一个解决方案:

In [21]: lst = [df1, df2]

In [22]: def renamer(df):
             return (df.iloc[2:]
                       .set_axis(df.iloc[1], axis='columns', inplace=False)
                       .rename_axis(None,1))

In [23]: new = list(map(renamer, lst))

In [24]: new[0]
Out[24]:
  newcolumn1name newcolumn2name
2              5             10
3              8             15
4             15             20

In [25]: new[1]
Out[25]:
  newcolumn1name newcolumn2name
2              5             10
3              8             15
4             15             20

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM