Фрейм данных Pandas показывает строки с желаемыми критериями

#python-3.x #pandas #dataframe

#python-3.x #pandas #фрейм данных

Вопрос:

В настоящее время я работаю со своими количественными кодами с помощью python. В последнее время я много работал с фреймом данных, и до вчерашнего дня один долбаный сбой довольно сильно ударил меня, и я совершенно растерялся, как получить желаемые результаты:

это DOM:

    ts_code    end_date   fcff          roe_yearly  roa_dp  roic_yearly  roe_yoy   q_op_qoq 
0   603000.SH  20191231  1.041476e 08  10.8941     7.6454  12.6005       47.5085   356.2437
1   603000.SH  20190930 -1.431920e 08   4.2044     2.2306   4.8479       31.2632   -25.7032
2   603000.SH  20190630 -2.267375e 08   2.9238     1.0385   3.5750      276.4166   449.9221
3   603000.SH  20190331 -3.097644e 08  -3.1372    -0.5800  -3.7248       62.9496  -116.0415
4   603000.SH  20181231  1.775266e 08   7.4066     5.4977   8.3623      122.7574    71.7184
5   603000.SH  20180930  3.023451e 07   3.2345     1.8423   3.8565      307.8660    98.3655
6   603000.SH  20180630 -1.042179e 08  -1.6766    -0.6451  -1.1682       19.8322   186.0172
7   603000.SH  20180331 -2.138164e 08  -8.4060    -1.6109  -8.4708      -27.0477  -167.3619
8   603000.SH  20171231  3.593505e 08   3.2401     2.4328   3.4555      -17.1973    76.1037
9   603000.SH  20170930 -2.170032e 07   0.7884     0.4471   1.0209      -78.5932    49.9168
10  603000.SH  20170630  2.299095e 07  -2.0970    -0.7922  -1.9708     -188.7621   156.7807
11  603000.SH  20170331 -6.089507e 07  -6.6504    -1.2439  -7.7056     -217.9714  -485.1622
12  603000.SH  20161231 -8.746122e 08   3.9054     2.9030   6.4299      -61.9080   -69.2861
13  603000.SH  20160930 -8.630607e 08   3.7055     2.1016   6.8464      -51.4469  2306.0770
14  603000.SH  20160630 -2.855617e 08   2.3550     0.8761   7.2218      -49.3369  -101.6762
15  603000.SH  20160331 -3.922060e 08   5.7132     1.0855  14.7152      103.8043    -2.5653
16  603000.SH  20151231 -1.632709e 08  10.4885     7.7055  12.7376      -21.8468    14.4998
  

То, что я хочу отфильтровать, — это годовой отчет, в котором отображаются только df['end_date'] совпадающие строки с датой окончания 1231. Кто-нибудь может дать мне направление для решения этой проблемы? Большое спасибо!

Ответ №1:

Первая идея — преобразовать значения в строки и выбрать значения путем индексации — значения после первых 4 чисел, сравнить по 1234 строке и отфильтровать по boolean indexin& :

 df1 = df[df['end_date'].astype(str).str[4:].eq('1231')]
print (df1)
      ts_code  end_date         fcff  roe_yearly  roa_dp  roic_yearly  
0   603000.SH  20191231  104147600.0     10.8941  7.6454      12.6005   
4   603000.SH  20181231  177526600.0      7.4066  5.4977       8.3623   
8   603000.SH  20171231  359350500.0      3.2401  2.4328       3.4555   
12  603000.SH  20161231 -874612200.0      3.9054  2.9030       6.4299   
16  603000.SH  20151231 -163270900.0     10.4885  7.7055      12.7376   

     roe_yoy  q_op_qoq  
0    47.5085  356.2437  
4   122.7574   71.7184  
8   -17.1973   76.1037  
12  -61.9080  -69.2861  
16  -21.8468   14.4998  
  

Решение работает с datetimes — сначала преобразует, а затем получает месяцы с днями по Series.dt.strftime :

 df1 = df[pd.to_datetime(df['end_date'], format='%Y%m%d').dt.strftime('%m%d').eq('1231')]
  

Комментарии:

1. большое спасибо, шеф! один вопрос, что str[4:] означает?

2. неважно, шеф, я понял, что вы имеете в виду под str[4:] , это сопоставление 5-й и конечной строк с точным выражением 1231.

Ответ №2:

это можно сделать с помощью операций со строками:

 df[df.end_date.astype(str).str.endswith("1231")]
  

Результат

       ts_code  end_date         fcff  roe_yearly  roa_dp  roic_yearly   roe_yoy  q_op_qoq
0   603000.SH  20191231  104147600.0     10.8941  7.6454      12.6005   47.5085  356.2437
4   603000.SH  20181231  177526600.0      7.4066  5.4977       8.3623  122.7574   71.7184
8   603000.SH  20171231  359350500.0      3.2401  2.4328       3.4555  -17.1973   76.1037
12  603000.SH  20161231 -874612200.0      3.9054  2.9030       6.4299  -61.9080  -69.2861
16  603000.SH  20151231 -163270900.0     10.4885  7.7055      12.7376  -21.8468   14.4998