python - 如何折叠/压缩/减少 pandas 中的字符串列

标签 python pandas group-by

本质上,我想做的是使用一个键将 Table_A 加入到 Table_B,以在 Table_B 中进行查找,以提取 Table_A 中存在的名称的列记录。

Table_B 可以被认为是存储有关名称的各种属性的主名称表。 Table_A 表示带有名称信息的传入数据。

有两列代表名称 - 名为“raw_name”的列和名为“real_name”的列。 “raw_name”在real_name之前有字符串“code_”。

raw_name = CE993_VincentHanna

real_name = VincentHanna

Key = real_name,存在于Table_A和Table_B中

请在此处查看 mySQL 表并查询:http://sqlfiddle.com/#!9/65e13/1

对于 Table_A 中不存在于 Table_B 中的所有 real_names,我想将 raw_name/real_name 对存储到一个对象中,以便我可以向数据输入人员发送手动插入警报。

对于 Table_A 中确实存在于 Table_B 中的所有 real_names,这意味着我们知道该名称,并且可以添加与该 real_name 关联的新 raw_name strong>进入我们的主Table_B

在 mySQL 中,这很容易做到,正如您在我的 sqlfidde 示例中看到的那样。我加入 real_name 并按 groupby a.real_name 压缩/折叠结果,因为我不关心 Table_B 中是否存在同一 real_name 的多个记录。

我想要的只是提取属性(stats1、stats2、stats3),以便我可以将它们分配给新发现的 raw_name。

在 mySQL 查询结果中,我可以分离要发送的 NULL 记录以进行手动数据输入,并自动将剩余记录插入到 Table_B 中。

现在,我尝试在 Pandas 中执行相同的操作,但陷入了实名的 groupby 点。

e = {'raw_name': pd.Series(['AW103_Waingro', 'CE993_VincentHanna', 'EES43_NeilMcCauley', 'SME16_ChrisShiherlis',
                          'MEC14_MichaelCheritto', 'OTP23_RogerVanZant', 'MDU232_AlanMarciano']),
     'real_name': pd.Series(['Waingro', 'VincentHanna', 'NeilMcCauley', 'ChrisShiherlis', 'MichaelCheritto', 
                           'RogerVanZant', 'AlanMarciano'])}

f = {'raw_name': pd.Series(['SME893_VincentHanna', 'TVA405_VincentHanna', 'MET783_NeilMcCauley', 
                            'CE321_NeilMcCauley', 'CIN453_NeilMcCauley', 'NIPS16_ChrisShiherlis',
                            'ALTW12_MichaelCheritto', 'NSP42_MichaelCheritto', 'CONS23_RogerVanZant',
                            'WAUE34_RogerVanZant']),
     'real_name': pd.Series(['VincentHanna', 'VincentHanna', 'NeilMcCauley', 'NeilMcCauley', 'NeilMcCauley',
                             'ChrisShiherlis', 'MichaelCheritto', 'MichaelCheritto', 'RogerVanZant',
                             'RogerVanZant']),
     'stats1': pd.Series(['meh1', 'meh1', 'yo1', 'yo1', 'yo1', 'hello1', 'bye1', 'bye1', 'namaste1',
                          'namaste1']),
     'stats2': pd.Series(['meh2', 'meh2', 'yo2', 'yo2', 'yo2', 'hello2', 'bye2', 'bye2', 'namaste2',
                          'namaste2']),
     'stats3': pd.Series(['meh3', 'meh3', 'yo3', 'yo3', 'yo3', 'hello3', 'bye3', 'bye3', 'namaste3',
                          'namaste3'])}

df_e = pd.DataFrame(e)
df_f = pd.DataFrame(f)

df_new = pd.merge(df_e, df_f, how='left', on='real_name', suffixes=['_left', '_right'])

df_new_grouped = df_new.groupby(df_new['raw_name_left'])

现在如何像在 mySQL 中那样以实名方式压缩/折叠 df_new_grouped 中的组。

一旦我有了一个带有折叠结果的对象,我就可以对数据帧进行切片以报告我们没有记录的真实名称(NULL值)以及我们已经知道并且可以存储新发现的原始名称的记录。

最佳答案

您可以根据 raw_name_left 列删除重复项,还可以使用 drop 删除 raw_name_right

In [99]: df_new.drop_duplicates('raw_name_left').drop('raw_name_right', 1)
Out[99]:
            raw_name_left        real_name    stats1    stats2    stats3
0           AW103_Waingro          Waingro       NaN       NaN       NaN
1      CE993_VincentHanna     VincentHanna      meh1      meh2      meh3
3      EES43_NeilMcCauley     NeilMcCauley       yo1       yo2       yo3
6    SME16_ChrisShiherlis   ChrisShiherlis    hello1    hello2    hello3
7   MEC14_MichaelCheritto  MichaelCheritto      bye1      bye2      bye3
9      OTP23_RogerVanZant     RogerVanZant  namaste1  namaste2  namaste3
11    MDU232_AlanMarciano     AlanMarciano       NaN       NaN       NaN

关于python - 如何折叠/压缩/减少 pandas 中的字符串列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30090151/

相关文章:

python - 如何从事件持续时间的数据帧创建时间序列?

python - 创建带有增量计数器的列,用于识别 Pandas 中的重复集

使用 GROUP 或 RANK 中的 WHERE 的 SQL 语句

sql - 如何统计 "group by"组内有多少行满足某个条件

python - CumSum 数据帧行,如果值在另一个数据帧上

php - 如何设置应用程序,使其在内存中具有持久进程,并且无需重新初始化即可运行?

python - 我应该使用线程或多处理来对 Python 进行暴力破解吗?

python - AWS Lambda 运行在 Windows 中创建的 zip 包

python - 如何获得按 numpy 和 pandas 中的变量分组的平均值?

r - 按列分组并将一列汇总为列表