代码之家  ›  专栏  ›  技术社区  ›  Starbucks

使用特定后缀拆分数据帧

  •  2
  • Starbucks  · 技术社区  · 6 年前

    我有一个数据框,我需要根据 _x _y . 带后缀的列名 _x 应形成一个带有后缀的数据框和列名 应该形成另一个数据帧。任何帮助都将不胜感激。谢谢

    例如:

    import pandas as pd
    import numpy as np
    df = pd.DataFrame(np.random.randint(0,10,size=(10, 4)), columns=list('ABCD'))
    df.rename(columns={'A':'A_x', 'B':'B_y','C':'C_x', 'D':'D_y'}, inplace=True)
    
    df
       A_x  B_y  C_x  D_y
    0    8    8    0    8
    1    3    2    9    8
    2    2    6    7    9
    3    4    1    7    7
    4    9    6    3    2
    5    3    3    0    3
    6    9    5    6    8
    7    3    7    9    0
    8    4    2    6    4
    9    8    5    8    2
    

    想要的输出:

       A_x  C_x
    0    8    0
    1    3    9
    2    2    7
    3    4    7
    4    9    3
    5    3    0
    6    9    6
    7    3    9
    8    4    6
    9    8    8
    

    df2

     B_y  D_y
    0    8    8
    1    2    8
    2    6    9
    3    1    7
    4    6    2
    5    3    3
    6    5    8
    7    7    0
    8    2    4
    9    5    2
    
    5 回复  |  直到 6 年前
        1
  •  2
  •   Karn Kumar    6 年前

    最简单、最容易与正则表达式一起使用 df.filter

    你可以参考 Documentation here

    实际数据帧:

    >>> df
       A_x  B_y  C_x  D_y
    0    8    9    5    1
    1    3    4    0    6
    2    9    7    0    4
    3    6    7    5    9
    4    4    3    7    5
    5    6    1    6    9
    6    5    4    5    4
    7    8    3    0    1
    8    7    4    4    4
    9    9    2    4    4
    

    申请 dataFrame.filter :

    >>> df1 = df.filter(regex='_x')
    >>> df2 = df.filter(regex='_y')
    

    您拆分的新数据帧 df1

    >>> df1
       A_x  C_x
    0    8    5
    1    3    0
    2    9    0
    3    6    5
    4    4    7
    5    6    6
    6    5    5
    7    8    0
    8    7    4
    9    9    4
    

    df2

    >>> df2
       B_y  D_y
    0    9    1
    1    4    6
    2    7    4
    3    7    9
    4    3    5
    5    1    9
    6    4    4
    7    3    1
    8    4    4
    9    2    4
    

    或: DataFrame.filter 具有 regex 哪个使用 re.search 在引擎盖下。

    >>> df1 = df.filter(regex='x$', axis=1)
    >>> df2 = df.filter(regex='y$', axis=1)
    

    DataFrame.filter like

    df1, df2 = df.filter(like='_x'), df.filter(like='_y')
    

    或者:使用 dataFrame.loc + contains

    df1 = df.loc[:, df.columns.str.contains('_x')]
    df2 = df.loc[:, df.columns.str.contains('_x')]
    

    或者:使用 + map lambda + endswith

    df1 = df.loc[:,df.columns.map(lambda x: x.endswith('_x'))]
    df2 = df.loc[:,df.columns.map(lambda x: x.endswith('_y'))]
    
        2
  •  1
  •   BENY    6 年前

    只是使用 split groupby ,将它们保存到dict中。请注意,此方法很容易应用于更多情况,例如:您有1000多列具有不同后缀,如x y z c a。。。。。

    d={x:y for x, y in df.groupby(df.columns.str.split('_').str[1],axis=1)}
    d['x']
       A_x  C_x
    0    8    0
    1    3    9
    2    2    7
    3    4    7
    4    9    3
    5    3    0
    6    9    6
    7    3    9
    8    4    6
    9    8    8
    
        3
  •  0
  •   U13-Forward    6 年前

    好吧,简单地做:

    df1=df[['A_x','C_x']]
    df2=df[['B_y','D_y']]
    

    那么现在 df1 df2

    更不具体的是:

    df1=df[[i for i in df.columns if i[-1]=='x']]
    df2=df[[i for i in df.columns if i[-1]=='y']]
    
        4
  •  0
  •   Chris    6 年前

    使用如何 endswith 关于列名?

    df1 = df[[c for c in df.columns if c.endswith('_x')]]
    df2 = df[[c for c in df.columns if c.endswith('_y')]]
    
        5
  •  0
  •   Amit Gupta    6 年前

    方法1:因为python中的索引从0开始,所以您可以使用

    df1 = df.iloc[:, [0,2]]
    df2 = df.iloc[:, [1,3]]
    

    方法2:因为这里的列名是已知的,所以您也可以使用

    df1=df[['A_x','C_x']]
    df2=df[['B_y','D_y']]
    

    这两种方法将给出相同的答案