![](/img/trans.png)
[英]How do I filter multiIndexed pandas DataFrame by a column value
[英]Pandas: How to add column to multiindexed dataframe?
我在 LinkedIn 上學習了一個關於多索引熊貓數據幀的簡短教程,在那里我無法重現一個看似非常基本的操作(3:00)。 您無需觀看視頻即可掌握問題。
以下使用來自 seaborn 的數據集的片段將顯示我無法使用視頻中顯示的技術將列添加到多索引熊貓數據幀,並在此處的 SO 帖子中進行了描述。
開始了:
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)
在這里,'total' 應該作為現有索引下的一個新列出現。 但我得到這個:
類型錯誤:無法將項目插入還不是現有類別的 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)
輸出:
類型錯誤:無法將項目插入還不是現有類別的 CategoricalIndex
改變:
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)
我知道這有點晚了,但我在課程的常見問題解答部分找到了您的問題的答案。 這是它所說的:
“問:Pandas 分類數據有哪些問題?
A. 從 0.6 版開始,seaborn.load_dataset 將某些列轉換為 Pandas 分類數據(參見http://pandas.pydata.org/pandas-docs/stable/categorical.html )。 這會在處理“熊貓簡介/使用多級索引”中使用的“航班”數據幀時產生問題。 為了避免這個問題,你可以直接用 Pandas 加載數據集:
航班 = pd.read_csv(' https://raw.githubusercontent.com/mwaskom/seaborn-data/master/flights.csv ')"
我希望這有幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.