Pandas:如何向多索引数据框添加列?
Posted
技术标签:
【中文标题】Pandas:如何向多索引数据框添加列?【英文标题】:Pandas: How to add column to multiindexed dataframe? 【发布时间】:2018-12-06 11:21:15 【问题描述】:我正在关注一个简短的tutorial on LinkedIn regarding multiindexed pandas dataframes,我无法重现一个看似非常基本的操作(在 3:00)。您无需观看视频即可掌握问题。
以下使用 seaborn 数据集的 sn-p 将显示我无法使用视频中显示的技术将列添加到多索引 pandas 数据帧中,并且还在 SO 帖子 here 中进行了描述。
我们开始吧:
import pandas as pd
import seaborn as sns
flights = sns.load_dataset('flights')
flights.head()
flights_indexed = flights.set_index(['year', 'month'])
flights_unstack = flights_indexed.unstack()
print(flights_unstack)
输出:
passengers
month January February March April May June July August September October November December
year
1949 112 118 132 129 121 135 148 148 136 119 104 118
1950 115 126 141 135 125 149 170 170 158 133 114 140
1951 145 150 178 163 172 178 199 199 184 162 146 166
1952 171 180 193 181 183 218 230 242 209 191 172 194
1953 196 196 236 235 229 243 264 272 237 211 180 201
1954 204 188 235 227 234 264 302 293 259 229 203 229
1955 242 233 267 269 270 315 364 347 312 274 237 278
1956 284 277 317 313 318 374 413 405 355 306 305 336
1957 315 301 356 348 355 422 465 467 404 347 310 337
1958 340 318 362 348 363 435 491 505 404 359 362 405
1959 360 342 406 396 420 472 548 559 463 407 362 405
1960 417 391 419 461 472 535 622 606 508 461 390 432
现在我想附加一列,显示每年使用的每月总和
flights_unstack.sum(axis = 1)
输出:
year
1949 1520
1950 1676
1951 2042
1952 2364
1953 2700
1954 2867
1955 3408
1956 3939
1957 4421
1958 4572
1959 5140
1960 5714
上面提到的两个来源通过使用以下简单的东西来证明这一点:
flights_unstack['passengers', 'total'] = flights_unstack.sum(axis = 1)
此处,“总计”应显示为现有索引下的新列。 但我得到了这个:
TypeError: 无法将项目插入到尚未存在的类别的 CategoricalIndex 中
我使用的是 Python 3,2015 年视频中的作者也是如此。
这是怎么回事?
我已经进行了一系列尝试,仅使用上述系列中的值,以及将数据机器人作为 pd.Series 和 pd.DataFrame 进行整形、转置、合并和加入。并重置索引。我可能忽略了一些重要的细节,现在我希望得到你们中的一些人的建议。
编辑 1 - 这是 jezrael 提出第一个建议后的尝试:
import pandas as pd
import seaborn as sns
flights = sns.load_dataset('flights')
flights.head()
flights_indexed = flights.set_index(['year', 'month'])
flights_unstack = flights_indexed['passengers'].unstack()
flights_unstack['total'] = flights_unstack.sum(axis = 1)
输出:
TypeError: 无法将项目插入到尚未存在的类别的 CategoricalIndex 中
【问题讨论】:
【参考方案1】:变化:
flights_unstack = flights_indexed.unstack()
到:
flights_unstack = flights_indexed['passengers'].unstack()
用于删除列中的Multiindex
。
最后是必要的add_categories
新列名:
flights_unstack.columns = flights_unstack.columns.add_categories(['total'])
flights_unstack['total'] = flights_unstack.sum(axis = 1)
print (df)
January February March April May June July August September \
month
1949 112 118 132 129 121 135 148 148 136
1950 115 126 141 135 125 149 170 170 158
1951 145 150 178 163 172 178 199 199 184
1952 171 180 193 181 183 218 230 242 209
1953 196 196 236 235 229 243 264 272 237
1954 204 188 235 227 234 264 302 293 259
1955 242 233 267 269 270 315 364 347 312
1956 284 277 317 313 318 374 413 405 355
1957 315 301 356 348 355 422 465 467 404
1958 340 318 362 348 363 435 491 505 404
1959 360 342 406 396 420 472 548 559 463
1960 417 391 419 461 472 535 622 606 508
October November December total
month
1949 119 104 118 1520
1950 133 114 140 1676
1951 162 146 166 2042
1952 191 172 194 2364
1953 211 180 201 2700
1954 229 203 229 2867
1955 274 237 278 3408
1956 306 305 336 4003
1957 347 310 337 4427
1958 359 362 405 4692
1959 407 362 405 5140
1960 461 390 432 5714
设置:
import pandas as pd
temp=u"""month;January;February;March;April;May;June;July;August;September;October;November;December
1949;112;118;132;129;121;135;148;148;136;119;104;118
1950;115;126;141;135;125;149;170;170;158;133;114;140
1951;145;150;178;163;172;178;199;199;184;162;146;166
1952;171;180;193;181;183;218;230;242;209;191;172;194
1953;196;196;236;235;229;243;264;272;237;211;180;201
1954;204;188;235;227;234;264;302;293;259;229;203;229
1955;242;233;267;269;270;315;364;347;312;274;237;278
1956;284;277;317;313;318;374;413;405;355;306;305;336
1957;315;301;356;348;355;422;465;467;404;347;310;337
1958;340;318;362;348;363;435;491;505;404;359;362;405
1959;360;342;406;396;420;472;548;559;463;407;362;405
1960;417;391;419;461;472;535;622;606;508;461;390;432"""
#after testing replace 'pd.compat.StringIO(temp)' to 'filename.csv'
df = pd.read_csv(pd.compat.StringIO(temp), sep=";", index_col=[0])
print (df)
df.columns = pd.CategoricalIndex(df.columns)
df.columns = df.columns.add_categories(['total'])
df['total'] = df.sum(axis = 1)
【讨论】:
感谢您的回答!不过,我仍然收到 TypeError 。我将根据您的建议在编辑中添加我的完整尝试。 @vestland - 所以需要在列中添加类别,需要对其进行测试。 df.columns 中的 df 指的是什么? flight_unstack? 对不起,我的测试数据框。 @vestland - 当然,df.columns = pd.CategoricalIndex(df.columns).add_categories(['total'])
【参考方案2】:
我知道这有点晚了,但我在课程的常见问题解答部分找到了您问题的答案。它是这样说的:
“问。Pandas 分类数据有什么问题?
A.从 0.6 版开始,seaborn.load_dataset 将某些列转换为 Pandas 分类数据(请参阅http://pandas.pydata.org/pandas-docs/stable/categorical.html)。这会在处理“Pandas 简介/使用多级索引”中使用的“航班”数据帧时产生问题。为避免此问题,您可以直接使用 Pandas 加载数据集:
航班 = pd.read_csv('https://raw.githubusercontent.com/mwaskom/seaborn-data/master/flights.csv')"
我希望这会有所帮助。
【讨论】:
这太棒了!谢谢!【参考方案3】:您可以使用以下内容:
df = pd.concat([flights_unstack.sum(axis = 'columns').rename('Total'), flights_unstack], axis = 'columns')
Results
然后您可以使用以下命令重置为多索引:
df.columns = pd.MultiIndex.from_tuples(('passangers', column) for column in df.columns)
Results
【讨论】:
以上是关于Pandas:如何向多索引数据框添加列?的主要内容,如果未能解决你的问题,请参考以下文章