【问题标题】:Reformat weird Dataframe重新格式化奇怪的数据框
【发布时间】:2022-11-14 14:17:06
【问题描述】:
Name place pers_data
NaN NaN Nan
Smith John NY sjohn@gmail.com
NaN Nan 0987 4567
NaN NaN 0653 6734
Vic Stied SA 0986 5332
NaN NaN vickie@hotmail.com

我想删除 NaN 值并重新格式化文件,如下所示:

Name Place pers_data other other_2
Smith John NY sjohn@gmail.com 0987 4567 0653 6734
Vic Stied SA vickie@hotmail.com 0986 5332

有人可以帮助我吗,我尝试了一些东西,但什么都不懂,我想真正得到我在做什么。

【问题讨论】:

  • 您能否将问题的标题更改为特定的内容?

标签: python pandas


【解决方案1】:

这是pivot 的变体:

idx = df['Name'].notna().cumsum()
out = (df
   .assign(col=df.groupby(idx).cumcount(),
           Name=df['Name'].groupby(idx).ffill(),
           place=df['place'].groupby(idx).ffill()
          )
   .pivot(index=['Name', 'place'], columns='col', values='pers_data')
   .add_prefix('other_').rename(columns={'other_0': 'pers_data'})
   .reset_index().rename_axis(columns=None)
   .dropna(how='all')
)

输出:

         Name place        pers_data             other_1    other_2
1  Smith John    NY  sjohn@gmail.com           0987 4567  0653 6734
2   Vic Stied    SA        0986 5332  vickie@hotmail.com        NaN

【讨论】:

  • 输出的第二行似乎有问题。 pers_date 和 other_1 被翻转。
  • 在输入数据中提供它们
  • @Christian 好吧,有原始顺序。如果没有 OP 解释具体规则,pandas 无法直接区分电子邮件地址和电话号码。
  • 真实的故事。请忽略我的评论:)
  • @Christian 这仍然是一个有效的评论,并且可行,但是您需要编写一些规则来识别不同类型的数据并决定如何组织它们(例如,如果没有电子邮件,是否应该保留 pers_data 列空的?)。如果需要,可能值得一个后续问题。
【解决方案2】:
df1.loc[~df1.isna().all(axis=1)].fillna(method='ffill')
    .groupby(['Name','place']).agg(','.join)
    .pers_data.str.split(',',expand=True).add_prefix('other_')
    .rename(columns={'other_0':'pers_data'}).reset_index()
        
                Name place        pers_data             other_1    other_2
        0  Smith John    NY  sjohn@gmail.com           0987 4567  0653 6734
        1   Vic Stied    SA        0986 5332  vickie@hotmail.com       None

【讨论】:

    猜你喜欢
    • 2021-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-09
    相关资源
    最近更新 更多