#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