【问题标题】:How to find first occurence of a specified integer over multiple columns using Pandas?如何使用 Pandas 在多列中查找指定整数的首次出现?
【发布时间】:2022-12-12 11:26:16
【问题描述】:

我有这个数据集:

        2010            2011            2012        
0   NaN                 NaN             505303.0
1   542225.0            NaN             210530.0
2   123210.0            429439.0        543964.0
3   434304.0            540325.0        NaN
4   750450.0            143430.0        540425.0
5   543015.0            549320.0        104365.0

我想首先像这样找到每个单元格的第一个数字(参见MWE):

    2010    2011    2012
0   -       -       5
1   5       -       2
2   1       4       5
3   4       5       -
4   7       1       5
5   5       5       1

但最后我想计算每行中 5 的第一次出现,以及它发生在哪一年。如果5出现在几个地方,我只想知道第一个。我该如何做到这一点?

    2010    2011    2012    Year
0   -       -       5       2012
1   5       -       2       2010
2   1       4       5       2012
3   4       5       -       2011
4   7       1       5       2012
5   5       5       1       2010

你会在下面找到MWE

import numpy as np

data = {"2010": [np.nan, 542225, 123210, 434304, 750450, 543015],
        "2011": [np.nan, np.nan, 429439, 540325, 143430, 549320],
        "2012": [505303, 210530, 543964, np.nan, 540425, 104365]
       }

df_t = pd.DataFrame(data)

for col in df_t.columns:
    df_t[col] = (df_t[col]
           .fillna(-1)
           .astype(str)
           .str[0]
           )

【问题讨论】:

  • @mozway - 请找到另一个骗局,OP 需要第二部分解决方案。

标签: python pandas dataframe


【解决方案1】:

您的解决方案应与DataFrame.apply一起使用:

df = df_t.fillna(-1).astype(str).apply(lambda x: x.str[0])
print (df)
  2010 2011 2012
0    -    -    5
1    5    -    2
2    1    4    5
3    4    5    -
4    7    1    5
5    5    5    1

然后通过字符串'5'进行比较,并通过DataFrame.idxmax获取第一个匹配的年份,如果没有匹配则获取None

m = df.eq('5')
df['Year'] = m.idxmax(axis=1).where(m.any(axis=1), None)
print (df)
  2010 2011 2012  Year
0    -    -    5  2012
1    5    -    2  2010
2    1    4    5  2012
3    4    5    -  2011
4    7    1    5  2012
5    5    5    1  2010

另一个只有数字值的想法:

df = df_t // (10 ** np.log10(df_t).fillna(1).astype(int))
print (df)
   2010  2011  2012
0   NaN   NaN   5.0
1   5.0   NaN   2.0
2   1.0   4.0   5.0
3   4.0   5.0   NaN
4   7.0   1.0   5.0
5   5.0   5.0   1.0

m = df.eq(5)
df['Year'] = m.idxmax(axis=1).where(m.any(axis=1), None)
print (df)
   2010  2011  2012  Year
0   NaN   NaN   5.0  2012
1   5.0   NaN   2.0  2010
2   1.0   4.0   5.0  2012
3   4.0   5.0   NaN  2011
4   7.0   1.0   5.0  2012
5   5.0   5.0   1.0  2010

【讨论】:

  • 谢谢@jezreal,它似乎按照我想要的方式工作:-)
  • @snate - 你可以添加以回答最终输出吗?谢谢。
  • @jezreal - 我不确定我是否听懂了。
  • @snate - 有问题的不是最终的 DataFrame,Year 列看起来如何。你可以在那里添加它吗?
猜你喜欢
  • 1970-01-01
  • 2020-10-26
  • 1970-01-01
  • 1970-01-01
  • 2020-12-03
  • 2021-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多