我有一个像这样的数据框
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
我如何压缩它以获得我想要的输出?
使用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
都有重复项,因此有必要在数据帧中使用聚合函数,如
:sum
,mean
。数据透视表
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)。我想在不运行任何显式循环的情况下执行此操作。这可能吗?