簡體   English   中英

Pandas:在單元格內的列表中查找第一個 True 值

[英]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.applyList.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM