簡體   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