在pandas中使用wide_to_long时,我有一个关于参数的问题。
有一个名为suffix
的参数,我不明白。
在文档中说:
后缀:str,默认'\ d +'
捕获所需后缀的正则表达式。 '\ d +'捕获数字后缀。没有数字的后缀可以用否定的字符类'\ D +'指定。您还可以进一步消除后缀的歧义,例如,如果您的宽变量的形式为Aone,Btwo,..,并且您有一个不相关的列Arating,您可以通过指定suffix ='(!?one | two)来忽略最后一个。 )'
版本0.20.0中的新功能。
问题:什么可以用于后缀?
我发现在使用wide_to_long时有人使用这样的后缀:suffix='.'
它做了什么?
答案 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
基本上,如果您可以使用正则表达式捕获它,则可以将其传递给后缀以仅使用所需的列。