当前位置: 首页 > 知识库问答 >
问题:

使用重复项解压多索引

颜镜
2023-03-14

我有一个像这样的数据框

Date     ID   Value
Mar-20   A     100
Mar-20   B     200
Mar-20   C     300
Apr-20   A     101
Apr-20   B     201
Apr-20   C     301

我正试图重新塑造它,使它看起来像这样

        Value
ID       A      B      c
Date
Mar-20  100    200    300
Apr-20  101    201    301

我从尝试开始

df = df.set_index(["Date", "ID"])

但取消堆叠会导致以下值错误:“索引包含重复的条目,无法重塑”所以我在So上找到了这个建议,这允许我取消堆叠

df = df.set_index(["Date", "ID"].append = True)

但是当我用“ID”(即df=df.unstack(“ID”)解栈时,我的结束数据帧看起来像这样

         Value 
Date     ID     A    B    C
Mar-20   A     100  NaN  NaN
Mar-20   B     NaN  200  NaN
Mar-20   C     NaN  NaN  300
Apr-20   A     101  NaN  NaN 
Apr-20   B     NaN  201  NaN 
Apr-20   C     NaN  NaN  301

我如何压缩它以获得我想要的输出?

共有1个答案

夏谦
2023-03-14

使用DataFrame.unstack的预期输出(索引的顺序已更改):

df = df.set_index(["Date", "ID"]).unstack()
print (df)
       Value          
ID         A    B    C
Date                  
Apr-20   101  201  301
Mar-20   100  200  300

对于正确的顺序是可能的添加to_datetime

df['Date'] = pd.to_datetime(df['Date'], format='%b-%y')
df = df.set_index(["Date", "ID"]).unstack()
print (df)
           Value          
ID             A    B    C
Date                      
2020-03-01   100  200  300
2020-04-01   101  201  301

如果需要正确顺序的原始格式:

df['Date'] = pd.to_datetime(df['Date'], format='%b-%y')
df = df.set_index(["Date", "ID"]).unstack().rename(lambda x: x.strftime('%b-%y'))
print (df)
       Value          
ID         A    B    C
Date                  
Mar-20   100  200  300
Apr-20   101  201  301

如果只有3列,则可以使用DataFrame。pivot,但如果有更多列失败,则不要在常规数据出现以下情况时使用它:

df['Date'] = pd.to_datetime(df['Date'], format='%b-%y')
df = df.pivot(*df.columns).rename(lambda x: x.strftime('%b-%y'))
print (df)
ID        A    B    C
Date                 
Mar-20  100  200  300
Apr-20  101  201  301

如果输入数据中的任何列只需要旋转3列,则使用:

df['Date'] = pd.to_datetime(df['Date'], format='%b-%y')
df = df.pivot('Date','ID','Value').rename(lambda x: x.strftime('%b-%y'))
print (df)
ID        A    B    C
Date                 
Mar-20  100  200  300
Apr-20  101  201  301

编辑:如果获取错误:

索引包含重复项,无法重新设置形状

这意味着每对Date,ID都有重复项,因此有必要在数据帧中使用聚合函数,如summean。数据透视表

print (df)
     Date ID  Value
0  Mar-20  A    100 <- same Date, ID
1  Mar-20  A    500 <- same Date, ID
2  Mar-20  B    200
3  Mar-20  C    300
4  Apr-20  A    101
5  Apr-20  B    201
6  Apr-20  C    301



df['Date'] = pd.to_datetime(df['Date'], format='%b-%y')
df = df.pivot_table(index='Date',
                    columns='ID',
                    values='Value',
                    aggfunc='sum').rename(lambda x: x.strftime('%b-%y'))
print (df)
ID        A    B    C
Date                 
Mar-20  600  200  300 < aggregate sum 100+500=600
Apr-20  101  201  301

如果需要多索引中的列,请使用:

df['Date'] = pd.to_datetime(df['Date'], format='%b-%y')
df = df.pivot_table(index='Date',
                    columns='ID',
                    values=['Value'], 
                    aggfunc='sum').rename(lambda x: x.strftime('%b-%y'))
print (df)
       Value          
ID         A    B    C
Date                  
Mar-20   600  200  300
Apr-20   101  201  301

更好的解决方案,如果需要避免排序,谢谢@anky:

df = df.groupby(["Date", "ID"],sort=False)['Value'].sum().unstack()
print (df)
ID        A    B    C
Date                 
Mar-20  600  200  300
Apr-20  101  201  301

 类似资料:
  • 问题内容: 我相信在A,B,C,D的两个表字段之间插入了唯一索引,以防止重复。但是我以某种方式简单地对它们做了一个普通索引。因此插入了重复项。它是2000万个记录表。 如果我将现有索引从普通索引更改为唯一索引,或者只是为A,B,C,D添加新的唯一索引,由于存在唯一记录,重复项将被删除还是添加失败?我将对其进行测试,但它已达到3000万条记录,并且我既不希望将表弄乱或复制它。 问题答案: 如果表中有

  • 如果包含重复元素,则返回false,在本例中,我希望知道中重复元素的索引,因为我需要在其他地方使用该索引。作为一个“链接”的集合,必须有某种方法来获取索引,但我在/API中找不到任何类似的东西。

  • 如果我定义一个像这样的分层索引数据框: 内容如下所示: 我知道如何提取与给定列对应的数据。例如。对于列: 如何提取符合以下标准集的数据: , , , column , , 列 和 、、列、以及从开始的所有列 是偶数 (顺便说一句,我做了不止一次rtfm,但我真的觉得难以理解。)

  • 我有两个数据集。 第一个,在市场变量中包含具有以下结构的一般市场趋势: 第二,在心情变量中,每一天都包含一些推文,在这个结构中带有同样的情绪: 所以,我想每天数一数有多少“熊市”和“牛市”情绪。它的工作原理,这是我的代码与注释: 结果如下: 所以它工作得很好,但我不明白为什么我不能访问或索引。 事实上,如果我尝试这样的事情: 我获得: 我错过了什么吗?谢啦

  • 我有一个带有ID,姓名和地址字段的员工类。如果两个雇员的 ID 和姓名完全相同,则认为他们是一样的。现在我有一个员工列表,现在我的任务是收集重复的员工。 这是我的员工类代码,带有基于id和name字段重写的hascode和equals方法。 现在我有这个代码可以找到重复的员工 这段代码运行良好,并在我的集合中给出了id为1的雇员。 如何使用Java 8 lamda和streams执行相同的操作?在

  • 我有一个多索引数据框,看起来像 uid tid文本 abc x t1 bcd y t2 uid 和 tid 是索引。我有一个 uid 列表,并希望获取与该列表中的 uid 相对应的行,但保留第 2 级索引值 (tid)。我想在不运行任何显式循环的情况下执行此操作。这可能吗?