【问题标题】:Python-Pandas: How do I create a create columns from rows in a DataFrame without redundancy?Python-Pandas:如何从 DataFrame 中的行创建创建列而没有冗余?
【发布时间】:2023-03-20 03:21:01
【问题描述】:

我加入了多个 DataFrame,现在我只有一个 DataFrame。现在我想为没有冗余的列创建相同的 ID 行。说清楚:

我现在拥有的 DataFrame:

        column1   column2   column3
row1      2          4         8

row2      1          18        7

row3      54         24       69

row3      54         24       10

row4      26         32       8

row4      26         28       8

你可以看到我有两个 row3 和 row4 但它们在 column2 和 column3 中是不同的

这是我想要得到的DataFrame:

        column1   column2   column3    row3_a    row4_a
row1      2          4         8        NULL      NUll

row2      1          18        7        NULL      NULL

row3      54         24       69         10       NULL

row4      26         28       8         NULL      28

任何想法我应该如何解决这个问题?

【问题讨论】:

  • 你能提供数据作为数据框构造函数吗?
  • 是的,我可以而且我已经做到了
  • 这不是 DataFrame 构造函数 (df = pd.DataFrame(...)) ;)
  • 那我应该使用哪个构造函数?

标签: python pandas dataframe


【解决方案1】:

这是一个奇怪的重塑,因为如果 column1 或 column2 中也有重复项,您将有歧义。因此,拥有 MultiIndex 可能是一个很好的解决方案。

此解决方案使用melt + drop_duplicatespivot 的组合进行重塑

from string import ascii_lowercase
letters = dict(enumerate(ascii_lowercase, start=1))

# add a/b/c to duplicated rows
suffix = df.groupby(level=0).cumcount().map(letters)
idx2 = (df.index+suffix).fillna('')

df2 = (
 df.assign(row=idx2)
   .reset_index()
   .melt(id_vars=['index', 'row'])
   .drop_duplicates(['variable', 'value'])
   .pivot(index='index', columns=['variable', 'row'], values='value')
   .rename_axis(columns=(None, None), index=None) # cleanup index names
)

输出:

     column1 column2       column3      
                     row4a         row3a
row1     2.0     4.0   NaN     8.0   NaN
row2     1.0    18.0   NaN     7.0   NaN
row3    54.0    24.0   NaN    69.0  10.0
row4    26.0    32.0  28.0     NaN   NaN

如果你愿意,你可以展平多索引:df2.columns = df2.columns.map(''.join),如果你真的想要你的模棱两可的名字:df2.columns = df2.columns.map(max)

【讨论】:

    猜你喜欢
    • 2021-10-24
    • 1970-01-01
    • 2022-10-01
    • 1970-01-01
    • 2019-08-31
    • 1970-01-01
    • 2015-10-29
    • 1970-01-01
    • 2015-03-09
    相关资源
    最近更新 更多