[英]Pandas: Find first True value in a list within a cell
tl; dr-我有一個 dataframe ,其中一列是 boolean 值的列表。 我需要創建另一列來顯示找到第一個 True 值的列表的索引。
長解釋:
我有一個帶有經濟數據時間表的 Pandas dataframe(每列是四分之一)。
我正在嘗試得出一些特定的指標,而我堅持的指標是“恢復”。 我試圖確定在時間線超過之前的峰值之前有多少個季度 go。
以下是我迄今為止所做的所有工作的一些示例數據。 對不起它的大小。
此特定問題的重要列:
最低點:時間線的最低點 nadir_qtr:最低點發生的季度
pre_peak:最低點前的最高點 pre_peak_qtr:出現前峰值的四分之一
為了找到恢復季度,我制作了一個包含 boolean 值列表的列 - 該數字是否大於峰值前:
df2['recovery_list'] = df2.apply(lambda x: (x['new'][x['nadir_qtr']:] > x['pre_peak']), axis=1)
在您使用以下代碼獲得 True 值之前,我可以獲取季度數:
next((i for i, j in enumerate(list(df2['recovery_list'][0])) if j), None)
Output: 7
但是當我使用代碼生成一個新列時:
df2['recovery_qtr'] = next((i for i, j in enumerate(list(df2['recovery_list'])) if j), None)
我收到以下錯誤:
ValueError:具有多個元素的數組的真值不明確。 使用 a.any() 或 a.all()
知道我在這里做錯了什么嗎?
我對解決這個問題的替代方法持開放態度,但這與我已經接近了。
qtrid | 指數 | area_fips | area_title | 2000.25 | 2000.5 | 2000.75 | 2001.0 | 2001.25 | 2001.5 | 2001.75 | 2002.0 | 2002.25 | 2002.5 | 2002.75 | 2003.0 | 2003.25 | 2003.5 | 2003.75 | 2004.0 | 2004.25 | 2004.5 | 2004.75 | 2005.0 | 2005.25 | 2005.5 | 2005.75 | 2006.0 | 2006.25 | 2006.5 | 2006.75 | 2007.0 | 2007.25 | 2007.5 | 2007.75 | 2008.0 | 最低點 | nadir_qtr | pre_peak | pre_peak_qtr | 恢復列表 | post_peak | post_peak_qtr | 新的 | 恢復 | 衰退 | 三角洲 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1374 | 27075 | 明尼蘇達州萊克縣 | 7518.0 | 8346.0 | 8642.0 | 7714.0 | 8154.0 | 9012.0 | 8818.0 | 8174.0 | 7642.0 | 8288.0 | 8840.0 | 8022.0 | 7854.0 | 8876.0 | 8642.0 | 7926.0 | 7838.0 | 9020.0 | 8644.0 | 8130.0 | 8060.0 | 8968.0 | 8694.0 | 8314.0 | 8182.0 | 9344.0 | 8810.0 | 8202.0 | 8214.0 | 9352.0 | 8898.0 | 8346.0 | 7642.0 | 10 | 9012.0 | 5 | 【假,假,假,假,假,假,假…… | 9352.0 | 29 | [7518.0、8346.0、8642.0、7714.0、8154.0、9012…… | 1 | 5 | 340.0 |
1 | 3073 | 54063 | 西弗吉尼亞州門羅縣 | 3812.0 | 4126.0 | 4072.0 | 4040.0 | 3894.0 | 4062.0 | 4086.0 | 4060.0 | 3950.0 | 4122.0 | 4014.0 | 3906.0 | 3772.0 | 3912.0 | 4032.0 | 3996.0 | 4112.0 | 4224.0 | 4242.0 | 4232.0 | 3962.0 | 4138.0 | 4090.0 | 4086.0 | 3978.0 | 4096.0 | 4070.0 | 4196.0 | 4138.0 | 4134.0 | 4210.0 | 4158.0 | 3772.0 | 14 | 4126.0 | 1 | [假,假,假,真,真,真,假,... | 4242.0 | 18 | [3812.0、4126.0、4072.0、4040.0、3894.0、4062…… | 1 | 13 | 116.0 |
2 | 1919年 | 36119 | 紐約州威徹斯特縣 | 794524.0 | 820670.0 | 813970.0 | 837170.0 | 807890.0 | 829618.0 | 805440.0 | 823416.0 | 799696.0 | 822272.0 | 807492.0 | 829566.0 | 800922.0 | 822528.0 | 805160.0 | 826352.0 | 808770.0 | 832592.0 | 819536.0 | 842588.0 | 813082.0 | 838078.0 | 823780.0 | 841502.0 | 815112.0 | 842546.0 | 827984.0 | 851376.0 | 830014.0 | 862302.0 | 840974.0 | 865742.0 | 799696.0 | 10 | 837170.0 | 3 | 【假,假,假,假,假,假,假…… | 865742.0 | 31 | [794524.0、820670.0、813970.0、837170.0、80789... | 1 | 7 | 28572.0 |
3 | 3103 | 55011 | 威斯康星州布法羅縣 | 8747.0 | 9320.0 | 9322.0 | 9298.0 | 9824.0 | 9445.0 | 9488.0 | 9910.0 | 9768.0 | 9142.0 | 10028.0 | 9060.0 | 9944.0 | 9583.0 | 10390.0 | 9256.0 | 9702.0 | 9462.0 | 9957.0 | 10740.0 | 10502.0 | 11230.0 | 11106.0 | 11158.0 | 11662.0 | 12302.0 | 12298.0 | 11267.0 | 10292.0 | 10938.0 | 10726.0 | 10450.0 | 9060.0 | 13 | 10028.0 | 10 | 【假,真,假,假,假,假,真…… | 12302.0 | 25 | [8747.0、9320.0、9322.0、9298.0、9824.0、9445.... | 1 | 3 | 2274.0 |
4 | 3683 | C2706 | 紐約州伊薩卡 MSA | 92042.0 | 95082.0 | 93852.0 | 94730.0 | 92978.0 | 96624.0 | 94556.0 | 95156.0 | 92922.0 | 95148.0 | 95666.0 | 96214.0 | 95192.0 | 97904.0 | 97330.0 | 97772.0 | 96510.0 | 98820.0 | 98532.0 | 99160.0 | 100396.0 | 100062.0 | 99060.0 | 99840.0 | 97912.0 | 100914.0 | 99772.0 | 101050.0 | 98418.0 | 101806.0 | 101344.0 | 102708.0 | 92922.0 | 10 | 96624.0 | 5 | [假,假,假,真,真,真,假,... | 102708.0 | 31 | [92042.0, 95082.0, 93852.0, 94730.0, 92978.0, ... | 1 | 5 | 6084.0 |
5 | 2365 | 45019 | 南卡羅來納州查爾斯頓縣 | 362554.0 | 378358.0 | 362860.0 | 369826.0 | 362656.0 | 364742.0 | 360836.0 | 359780.0 | 358752.0 | 370100.0 | 368878.0 | 369464.0 | 369964.0 | 377104.0 | 376108.0 | 378814.0 | 379144.0 | 389946.0 | 389044.0 | 391862.0 | 388852.0 | 402586.0 | 398644.0 | 398042.0 | 396874.0 | 406484.0 | 410372.0 | 416576.0 | 417812.0 | 427552.0 | 424776.0 | 424316.0 | 358752.0 | 10 | 378358.0 | 1 | 【假,假,假,假,假,真,真…… | 427552.0 | 29 | [362554.0、378358.0、362860.0、369826.0、36265... | 1 | 9 | 49194.0 |
6 | 3448 | C1722 | 克拉克斯堡,西弗吉尼亞州 | 35242.0 | 36634.0 | 36225.0 | 36026.0 | 35447.0 | 36476.0 | 35968.0 | 36227.0 | 35571.0 | 36785.0 | 36377.0 | 36863.0 | 35954.0 | 37505.0 | 37048.0 | 37325.0 | 36400.0 | 37701.0 | 37407.0 | 37503.0 | 36407.0 | 37653.0 | 37616.0 | 37383.0 | 36977.0 | 37625.0 | 37037.0 | 37227.0 | 36265.0 | 37617.0 | 37227.0 | 37570.0 | 35571.0 | 10 | 36785.0 | 9 | [假,真,假,真,真,真,假,... | 37701.0 | 17 | [35242.0, 36634.0, 36225.0, 36026.0, 35447.0, ... | 1 | 1 | 916.0 |
7 | 3297 | C1086 | 德克薩斯州愛麗絲 | 13001.0 | 13245.0 | 13460.0 | 13800.0 | 13642.0 | 14243.0 | 14145.0 | 14031.0 | 13873.0 | 14086.0 | 14208.0 | 14106.0 | 14522.0 | 14855.0 | 14959.0 | 15120.0 | 15105.0 | 15492.0 | 15554.0 | 15695.0 | 15517.0 | 15713.0 | 15970.0 | 15874.0 | 16127.0 | 16666.0 | 16778.0 | 16876.0 | 17380.0 | 18144.0 | 18178.0 | 17937.0 | 13873.0 | 10 | 14243.0 | 5 | [假,假,真,真,真,真,真,... | 18178.0 | 30 | [13001.0, 13245.0, 13460.0, 13800.0, 13642.0, ... | 1 | 5 | 3935.0 |
8 | 742 | 18063 | 印第安納州亨德里克斯縣 | 58656.0 | 60586.0 | 60618.0 | 60272.0 | 59964.0 | 63238.0 | 65434.0 | 65000.0 | 65534.0 | 66824.0 | 68710.0 | 68680.0 | 67982.0 | 70936.0 | 72554.0 | 74030.0 | 74836.0 | 77138.0 | 78370.0 | 78876.0 | 77654.0 | 79878.0 | 81936.0 | 82752.0 | 83174.0 | 86144.0 | 88166.0 | 88914.0 | 88606.0 | 91556.0 | 93514.0 | 93744.0 | 65000.0 | 9 | 65534.0 | 8 | 【真,真,真,真,真,真,真,真,真…… | 93744.0 | 31 | [58656.0, 60586.0, 60618.0, 60272.0, 59964.0, ... | 1 | 1 | 28210.0 |
9 | 3618 | C2446 | 大彎,堪薩斯州 MicroSA | 12532.0 | 13213.0 | 13015.0 | 13207.0 | 12852.0 | 13368.0 | 13077.0 | 13216.0 | 13144.0 | 13396.0 | 13348.0 | 12961.0 | 12487.0 | 12791.0 | 12690.0 | 12638.0 | 12520.0 | 12953.0 | 12679.0 | 12804.0 | 12600.0 | 13152.0 | 12685.0 | 12886.0 | 12946.0 | 13264.0 | 12943.0 | 13339.0 | 13160.0 | 13433.0 | 13111.0 | 13546.0 | 12487.0 | 14 | 13396.0 | 9 | 【假,假,假,假,假,假,假…… | 13546.0 | 31 | [12532.0, 13213.0, 13015.0, 13207.0, 12852.0, ... | 1 | 5 | 150.0 |
考慮下面df
:
In [952]: df = pd.DataFrame({'A':[[True, False, True], [False, True, False], [False, False, False, True]]})
In [953]: df
Out[953]:
A
0 [True, False, True]
1 [False, True, False]
2 [False, False, False, True]
您可以使用df.apply
和List.index
來做到這一點:
In [955]: df['True_index'] = df['A'].apply(lambda x: x.index(True))
In [956]: df
Out[956]:
A True_index
0 [True, False, True] 0
1 [False, True, False] 1
2 [False, False, False, True] 3
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.