繁体   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