在一个大熊猫数据框中将3个文本列折叠为1

伦伍德

我有一个数据集,其中一种数据类型分布在多列中。我想将它们简化为一列。我有一个函数可以完成此任务,但是它的过程很繁琐,我希望有一种更干净的方法可以完成此任务。这是我的数据的一个玩具样本:

UID    COMPANY    EML    MAI   TEL
273    7UP        nan    nan   TEL
273    7UP        nan    MAI   nan
906    WSJ        nan    nan   TEL
906    WSJ        EML    nan   nan
736    AIG        nan    MAI   nan

我想要得到的是:

UID    COMPANY   CONTACT_INFO
273    7UP       MT
906    WSJ       ET
736    AIG       M

我已经写一个函数转换解决了这个EMLMAI或者TEL来一个质数,汇总结果,则总和转换为成分接触的类型。这行得通,而且相当快。这是一个示例:

def columnRedux(df):
    newDF = df.copy()
    newDF.fillna('-', inplace=True)
    newDF['CONTACT_INFO'] = newDF['EML'] + newDF['MAI'] + newDF['TEL']
    newDF.replace('EML--', 7, inplace=True)
    newDF.replace('-MAI-', 101, inplace=True)
    newDF.replace('--TEL', 1009, inplace=True)

    small = newDF.groupby(['UID', 'COMPANY'], as_index=False)['CONTACT_INFO'].sum()

    small.replace(7, 'E', inplace=True)
    small.replace(101, 'M', inplace=True)
    small.replace(108, 'EM', inplace=True)
    small.replace(1009, 'T', inplace=True)
    small.replace(1016, 'ET', inplace=True)
    small.replace(1110, 'MT', inplace=True)
    small.replace(1117, 'EMT', inplace=True)

    return small

df1 = pd.DataFrame(
    {'EML' : [np.nan, np.nan, np.nan, 'EML', np.nan, np.nan, 'EML', np.nan, np.nan, 'EML', 'EML', np.nan],
    'MAI' : [np.nan, 'MAI', np.nan, np.nan, 'MAI', np.nan, np.nan, np.nan, 'MAI', np.nan, np.nan, 'MAI'],
    'COMPANY' : ['7UP', '7UP', 'UPS', 'UPS', 'UPS', 'WSJ', 'WSJ', 'TJX', 'AIG', 'CDW', 'HEB', 'HEB'],
    'TEL' : ['TEL', np.nan, 'TEL', np.nan, np.nan, 'TEL', np.nan, 'TEL', np.nan, np.nan, np.nan, np.nan],
    'UID' : [273, 273, 865, 865, 865, 906, 906, 736, 316, 458, 531, 531]},
    columns=['UID', 'COMPANY', 'EML', 'MAI', 'TEL'])

cleanDF = columnRedux(df1)

我的问题是我有几个数据集,每个数据集都有自己的“宽”列集。有些减少了5列以上。对所有变体进行硬编码转换并非易事。有没有更清洁的方式来实现这一目标?

安东vBR

也许不是“最好的”解决方案。但是一个方法是使用一个简单的groupby并对包含的元素进行条件处理:

df = df.groupby(['UID','COMPANY'])[['EML','MAI','TEL']]\
    .apply(lambda x: ''.join(sorted([i[0] for y in x.values for i in y if pd.notnull(i)])))\
    .reset_index()\
    .rename(columns={0:'CONTACT_INFO'})

或替代方法是将分组的数据帧转换为类型str并替换字符串和sum。我会说很可读。

m = {
    'nan':'',
    'EML':'E',
    'MAI':'M',
    'TEL':'T'
}

df = df.groupby(['UID','COMPANY'])[['EML','MAI','TEL']]\
       .apply(lambda x: x.astype(str).replace(m).sum().sum())\
       .reset_index()\
       .rename(columns={0:'CONTACT_INFO'})

完整示例:

import pandas as pd
import numpy as np

data = '''\
UID    COMPANY    EML    MAI   TEL
273    7UP        nan    nan   TEL
273    7UP        nan    MAI   nan
906    WSJ        nan    nan   TEL
906    WSJ        EML    nan   nan
736    AIG        nan    MAI   nan'''

fileobj = pd.compat.StringIO(data)
df = pd.read_csv(fileobj, sep='\s+').replace('NaN',np.nan)

# use a nested list comprehension to flatten the array and remove nans.
df = df.groupby(['UID','COMPANY'])[['EML','MAI','TEL']]\
    .apply(lambda x: ''.join(sorted([i[0] for y in x.values for i in y if pd.notnull(i)])))\
    .reset_index()\
    .rename(columns={0:'CONTACT_INFO'})

print(df)

返回值:

UID  COMPANY  CONTACT_INFO
273      7UP            MT
736      AIG             M
906      WSJ            ET
dtype: object

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何将列表的数据框列折叠为 NLP 的一个列表

如何在大熊猫DataFrame中将3列的组连接成一个?

大熊猫:从现有的列值创建一个新的数据框

大熊猫:根据另一个数据框的列选择数据框列

大熊猫使用另一个数据框列在数据框列中填充NaN

将数据框中的行折叠为一个特定行以填充缺失值?

如何旋转数据框以将多行折叠为一个

大熊猫合并两个数据框,其中一个包含另一列的值

大熊猫:删除另一个数据框中的行,对列的子集进行比较

如何将一个包含合并值的大熊猫数据框列拆分为几列

大熊猫:基于两列,用另一个数据框的值替换一个数据框的值

在第二个数据框中为每个观察找到一个大熊猫数据框中最近的(纬度/经度)观察

在python 3大熊猫中将分类变量聚合为一个变量

回填大熊猫数据框错过了第一个月

大熊猫每天将小时(仅小时)放入一个数据框中

如何编写一个遍历大熊猫数据框组并应用分层条件的函数?

Excel:如何使用分组列将几行稀疏数据折叠为一个

大熊猫通过数据框的2列将一个系列映射到另一个系列

如何在熊猫中将多列折叠为一

在大熊猫创建一个数据帧的列的组合字典

创建一个遍历大熊猫中大型数据集中的列的变量

大熊猫-按行元素按另一个数据框过滤数据框

在 Laravel 中将两个集合折叠为一个

大熊猫:使用来自单独数据框中一个单元格的值填充数据框列中的所有行

将两个大熊猫数据框与第一个索引相连吗?

大熊猫将一个数据框与另一个groupby数据框组合在一起

大熊猫将数据框附加到另一个不合并列值

如何加入两个大熊猫数据框

将多列值折叠为1个因子