Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用自定义函数将dataframe中的许多列解析/拆分为多个列_Python_Pandas_Dataframe_Parsing_Split - Fatal编程技术网

Python 使用自定义函数将dataframe中的许多列解析/拆分为多个列

Python 使用自定义函数将dataframe中的许多列解析/拆分为多个列,python,pandas,dataframe,parsing,split,Python,Pandas,Dataframe,Parsing,Split,我已经查阅了很多以前相关的SO帖子,但我无法修改它们来解决我的问题 下面是一个数据帧示例 #使用pandas 0.24.2 数据={'customer_id':[1,2,3], “上一个到期日”:[“2010年6月”、“2019年4月”、“1999年12月], “当前到期日”:[“2019年8月”、“2045年12月”、“2000年1月], ‘下一个到期日’:[‘2025年2月’、‘2065年11月’、‘2001年9月’] } df=pd.DataFrame(数据) 这里是dataframe

我已经查阅了很多以前相关的SO帖子,但我无法修改它们来解决我的问题

下面是一个数据帧示例

#使用pandas 0.24.2
数据={'customer_id':[1,2,3],
“上一个到期日”:[“2010年6月”、“2019年4月”、“1999年12月],
“当前到期日”:[“2019年8月”、“2045年12月”、“2000年1月],
‘下一个到期日’:[‘2025年2月’、‘2065年11月’、‘2001年9月’]
} 
df=pd.DataFrame(数据)
这里是dataframe的外观,在实际的dataframe中还有更多这样的列需要解析,因此我的问题是

客户id上一个到期日当前到期日下一个到期日
0 2010年6月1日2019年8月2025年2月
2019年4月2日2045年12月2065年11月
2 1999年12月3日2000年1月2001年9月
我创建了一个函数来解析一列(即,这将向提供的df添加两个解析的列——月和年列)

def parse_列(df,col_parse):
col_parse_mmm=col_parse+'_mmm'
col_parse_yyy=col_parse+'_yyy'
df[[col_parse_mmm,col_parse_yyyy]]=df[col_parse].str.split('-',expand=True)
返回df
在下面调用此函数会对提供的列执行以下操作:

parse_列(df,'prev_due_date')
现在,我的问题是:

  • 如何使用apply对我选择的任意数量的列(例如,要解析的十列或数百列的列表)执行此操作

  • 是否可以避免使用应用

  • (您不需要在parse_column函数中返回df)

    如果您已经有了包含您感兴趣的列名的列表:

    for c in my_columns_list:
        parse_column(df, c)
    

    你不需要任何
    应用

    我想主要的问题是你为什么需要这样做?如果您可以操纵日期,那么有更好的方法来存储此信息,而无需跨数百列复制数据。为什么不在列中使用
    pd.to_datetime
    ,以及在需要
    月份时使用
    ,您使用.dt.month`acessor?@ALollz我在示例中选择的日期列可能会产生误导。实际上,我想解析任意数量的字符列,比如带有city和zip的full address,但在我的示例中,我碰巧选择了date列。当您声明“您不需要在parse_column函数中返回df”时,您的意思是什么?如果我的parse_column函数没有返回带有两个已命名已解析列的df,您的意思是返回通用的“0”和“1”列吗?您不需要返回任何内容。参数通过赋值传递。调用函数
    parse_列(df,c)
    时,创建对
    df
    的引用,并通过值将该引用传递给函数。您可以说服自己,但在函数之前、内部和之后都添加一个
    打印(id(df))
    :所有id都是相同的。另见。
    for c in my_columns_list:
        parse_column(df, c)