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

Python 在多个数据帧上执行列重命名和切片,python,pandas,Python,Pandas,范例 对于这个示例,我想做的是删除第一行,并使用第二行的字符串重命名列 我可以使用以下代码(这里是完整的python新手): 现在,我希望能够在示例中定义的df1和df2上实现这一点。我试过列表、字典和地图,但都遇到了问题 有人能想出最简单的方法吗?在我的真实数据上,我将有六到十个数据帧(~1000x8000)来运行它 IIUC df=df[1:] new_header = df.iloc[0] df=df[1:] df.columns = new_header df Out[26]: 1

范例

对于这个示例,我想做的是删除第一行,并使用第二行的字符串重命名列

我可以使用以下代码(这里是完整的python新手):

现在,我希望能够在示例中定义的df1和df2上实现这一点。我试过列表、字典和地图,但都遇到了问题

有人能想出最简单的方法吗?在我的真实数据上,我将有六到十个数据帧(~1000x8000)来运行它

IIUC

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
更新

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]
更新2

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

您可以将逻辑转换为函数并使用。类似于下面的方法可能有效(未经测试)


熊猫0.21+的另一个解决方案:

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)

不完全是。我想返回两个数据帧,df1和df2,它们执行了上面的切片和重命名。完美。是否有办法从列表中提取姓名,还是我一直在硬编码“df1”、“df2”。正如我在开始时所说,我没有太多的dFs可供使用,所以硬编码也不算太糟糕。嗨,JP,谢谢你在上面介绍了一些东西。这确实返回了正确的格式,但仅在一个这样的数据帧上返回。我曾尝试过类似的方法,但不幸的是得到了与此相同的结果。@Sparky_47。好的,我恐怕无法进一步帮助您,除非您有特定的数据和错误消息要共享。嘿,JP,这是一个单独的数据帧,它是**my_d*8f。没有错误消息,因为它运行得很干净,但当我想同时运行df1和df2时,它似乎只输出一个数据帧。虽然您的示例看起来很棒,但我得到了

回溯(最近一次调用):文件“”,第1行,在new=list(map(renamer,lst))文件“”中,第3行,在renamer.set_axis(df.iloc[1]中,axis='columns',inplace=False)TypeError:set_axis()为参数'axis'@Sparky_47获取了多个值,很可能您有一个旧版本的Pandas。尝试使用
axis=1
而不是
axis='columns'
您是否从某个CSV中读取此信息?如果是这样的话,您可能只需在读取时跳过第一行,并避免所有这些操作。它来自转置的csv,因此在某个时候,我将了解如何在导入时排除,然后我将能够跳过第一行。谢谢你的提示!有一个
skiprows
的论点,我认为这会让你的生活更轻松。我认为你是对的,但在导入后必须转换(或者至少我认为我是这样),所以这就是我目前的困境。
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
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)
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