pandas wide_to_long后缀参数

时间:2018-05-03 17:26:20

标签: python pandas

在pandas中使用wide_to_long时,我有一个关于参数的问题。 有一个名为suffix的参数,我不明白。

在文档中说:

  

后缀:str,默认'\ d +'

     

捕获所需后缀的正则表达式。 '\ d +'捕获数字后缀。没有数字的后缀可以用否定的字符类'\ D +'指定。您还可以进一步消除后缀的歧义,例如,如果您的宽变量的形式为Aone,Btwo,..,并且您有一个不相关的列Arating,您可以通过指定suffix ='(!?one | two)来忽略最后一个。 )'

     

版本0.20.0中的新功能。

问题:什么可以用于后缀?

我发现在使用wide_to_long时有人使用这样的后缀:suffix='.' 它做了什么?

1 个答案:

答案 0 :(得分:3)

TLDR :正则表达式捕获组可用于后缀参数。

suffix参数告诉pandas.wide_to_long它应该根据存根之后的后缀在转换中包含哪些列。

从长到大的默认行为假设您的列标有数字,因此例如列A1, A2, A3, A4可以正常工作而不指定后缀参数,而Aone, Atwo, Athree, Afour将失败。

正如所解释的那样,在极少数情况下,您的列可能是A1, A2, A3, A4, A100,并且您不希望实际包含A100,因此它还有其他各种用途,因为它不是{\ n}实际上与其他A#列相关。

以下是一些说明性示例。

import pandas as pd
df = pd.DataFrame({'id': [1,2], 'A_1': ['a', 'b'],
                  'A_2': ['aa', 'bb'], 'A_3': ['aaa', 'bbb'],
                  'A_person': ['Mike', 'Amy']})

pd.wide_to_long(df, stubnames='A_', i='id', j='num')
#       A_person   A_
#id num              
#1  1       Mike    a
#2  1        Amy    b
#1  2       Mike   aa
#2  2        Amy   bb
#1  3       Mike  aaa
#2  3        Amy  bbb

由于默认行为是仅考虑数字,因此忽略了'A_person'。如果您想将其添加到转化中,那么您将使用suffix参数。让我们告诉它我们想要数字或单词。

pd.wide_to_long(df, stubnames='A_', i='id', j='suffix', suffix='(\d+|\w+)')
#             A_
#id suffix         
#1  1          a
#2  1          b
#1  2         aa
#2  2         bb
#1  3        aaa
#2  3        bbb
#1  person  Mike
#2  person   Amy

现在,如果您的df在没有数字后缀的情况下启动,您也可以使用suffix参数来处理它。默认调用将失败,因为它需要数字,但告诉它查找单词会为您提供所需的数据。

df = pd.DataFrame({'id': [1,2], 'A_one': ['a', 'b'],
                  'A_two': ['aa', 'bb'], 'A_three': ['aaa', 'bbb'],
                  'A_person': ['Mike', 'Amy']})

pd.wide_to_long(df, stubnames='A_', i='id', j='num')
#Empty DataFrame
#Columns: [A_three, A_person, A_one, A_two, A_]
#Index: []

pd.wide_to_long(df, stubnames='A_', i='id', j='suffix', suffix='\w+')
#             A_
#id suffix         
#1  one        a
#2  one        b
#1  person  Mike
#2  person   Amy
#1  three    aaa
#2  three    bbb
#1  two       aa
#2  two       bb

如果您不想包含A_person,则可以告诉后缀参数仅包含某些存根。

pd.wide_to_long(df, stubnames='A_', i='id', j='num', suffix='(one|two|three)')
#         A_person   A_
#id num                
#1  one       Mike    a
#2  one        Amy    b
#1  three     Mike  aaa
#2  three      Amy  bbb
#1  two       Mike   aa
#2  two        Amy   bb

基本上,如果您可以使用正则表达式捕获它,则可以将其传递给后缀以仅使用所需的列。