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

时间:2018-02-14 19:37:43

标签: python pandas

实施例

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)来运行它。

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

您可以将逻辑转换为函数并使用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)

答案 2 :(得分:1)

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