Хорошо, это мой настоящий фрейм данных, который я хочу выполнить для преобразования определенных значений со списком. Итак, мне нужно изменить этот фрейм данных.

[Out] = df

    Keterangan                                                       Q2 2019        Q2 2018
0   Kas                                                              22686796.0     27421625.0
1   Giro pada bank indonesia                                         68409507.0     71159442.0
2   Giro pada bank lain                                              15675129.0     12584938.0
3   Giro pada bank lain pihak ketiga                                 88548.0        92417.0
4   Giro pada bank lain pihak berelasi                               41391653.0     84668151.0
5   Penempatan pada bank indonesia dan bank lain                     1825890.0      2349900.0
6   Penempatan pada bank indonesia dan bank lain pihak ketiga        28443695.0     30264303.0
7   Penempatan pada bank indonesia dan bank lain pihak berelasi      144798482.0    154020507.0
8   Efek-efek yang diperdagangkan                                    -758.0        -758.0
9   Efek-efek yang diperdagangkan pihak ketiga                       24081797.0     9396553.
10  Efek-efek yang diperdagangkan pihak berelasi                     20253524.0     20584035.0
11  Cadangan kerugian penurunan nilai pada efek-efek                 2713267.0      6858655.0
12  Efek yang dibeli dengan janji dijual kembali                     7014696.0      10165310.0
13  Wesel ekspor dan tagihan lainnya                                 573030.0       1477693.0
14  Wesel ekspor dan tagihan lainnya pihak ketiga                    335008.0       485810.0
15  Wesel ekspor dan tagihan lainnya pihak berelasi                  748120507.0    709223043.0
16  Tagihan akseptasi                                                113999397.0    110787114.0
17  Tagihan akseptasi pihak ketiga                                   -38848157.0    -35017982.0
18  Tagihan akseptasi pihak berelasi                                 NaN            NaN
19  Tagihan derivatif                                                NaN            NaN
20  Tagihan derivatif pihak ketiga                                   NaN            NaN
21  Pinjaman yang diberikan                                          NaN            NaN
22  Pinjaman yang diberikan pihak ketiga                             NaN            NaN
23  Pinjaman yang diberikan pihak berelasi                           NaN            NaN
24  Cadangan kerugian                                                NaN            NaN

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

my_list = ['Giro pada bank lain', 'Penempatan pada bank indonesia dan bank lain', 'Efek-efek yang diperdagangkan', 'Wesel ekspor dan tagihan lainnya', 'Tagihan akseptasi', 'Tagihan derivatif', 'Pinjaman yang diberikan']

Поэтому, если строка, содержащаяся в столбце ['Keterangan'], совпадает со строкой элемента в списке, она изменит форму определенных столбцов [Q2 2019] и [Q2 2018], чтобы они опустились. Итак, вот какой фрейм данных я хочу.

    [Out] : df1
    Keterangan                                                           Q2 2019        Q2 2018
0   Kas                                                              22686796.0     27421625.0
1   Giro pada bank indonesia                                         68409507.0     71159442.0
2   Giro pada bank lain                                              Nan            Nan
3   Giro pada bank lain pihak ketiga                                 15675129.0     12584938.0
4   Giro pada bank lain pihak berelasi                               88548.0        92417.0
5   Penempatan pada bank indonesia dan bank lain                     Nan            Nan
6   Penempatan pada bank indonesia dan bank lain pihak ketiga        41391653.0     84668151.0
7   Penempatan pada bank indonesia dan bank lain pihak berelasi      1825890.0      2349900.0
8   Efek-efek yang diperdagangkan                                    Nan            Nan
9   Efek-efek yang diperdagangkan pihak ketiga                       28443695.0     30264303.0
10  Efek-efek yang diperdagangkan pihak berelasi                     144798482.0    154020507.0
11  Cadangan kerugian penurunan nilai pada efek-efek                 -758.0        -758.0
12  Efek yang dibeli dengan janji dijual kembali                     24081797.0     9396553
13  Wesel ekspor dan tagihan lainnya                                 Nan            Nan
14  Wesel ekspor dan tagihan lainnya pihak ketiga                    20253524.0     20584035.0
15  Wesel ekspor dan tagihan lainnya pihak berelasi                  2713267.0      6858655.0
16  Tagihan akseptasi                                                Nan            Nan
17  Tagihan akseptasi pihak ketiga                                   7014696.0      10165310.0
18  Tagihan akseptasi pihak berelasi                                 573030.0       1477693.0
19  Tagihan derivatif                                                NaN            NaN
20  Tagihan derivatif pihak ketiga                                   335008.0       485810.0
21  Pinjaman yang diberikan                                          NaN            NaN
22  Pinjaman yang diberikan pihak ketiga                             748120507.0    709223043.0
23  Pinjaman yang diberikan pihak berelasi                           113999397.0    110787114.0
24  Cadangan kerugian                                                -38848157.0    -35017982.0

Мне нужно попробовать какой-то код, чтобы изменить его, переместить df.index в другой столбец и переключить столбец ['Keterangan'] на индекс.

match = df['Keterangan'].str.fullmatch('|'.join(entry for entry in my_list))
df['shift'] = match.cumsum()
df['index'] = df.index
df.set_index('Keterangan', drop=True, inplace=True)

И его работа по переключению и переключению index.

                                                            Q2 2019     Q2 2018   shift index
Keterangan              
Kas                                                         22686796.0  27421625.0  0     0
Giro pada bank indonesia                                    68409507.0  71159442.0  0     1
Giro pada bank lain                                         15675129.0  12584938.0  1     2
Giro pada bank lain pihak ketiga                            88548.0     92417.0     1     3
Giro pada bank lain pihak berelasi                          41391653.0  84668151.0  1     4
Penempatan pada bank indonesia dan bank lain                1825890.0   2349900.0   2     5
Penempatan pada bank indonesia dan bank lain pihak ketiga   28443695.0  30264303.0  2     6
Penempatan pada bank indonesia dan bank lain pihak berelasi 144798482.0 154020507.0 2     7
Efek-efek yang diperdagangkan                               -758.0      -758.0      3     8
Efek-efek yang diperdagangkan pihak ketiga                  24081797.0  9396553.0   3     9
Efek-efek yang diperdagangkan pihak berelasi                20253524.0  20584035.0  3     10
Cadangan kerugian penurunan nilai pada efek-efek yang       2713267.0   6858655.0   3     11
Efek yang dibeli dengan janji dijual kembali                7014696.0   10165310.0  3     12
Wesel ekspor dan tagihan lainnya                            573030.0    1477693.0   4     13
Wesel ekspor dan tagihan lainnya pihak ketiga               335008.0    485810.0    4     14
Wesel ekspor dan tagihan lainnya pihak berelasi             748120507.0 709223043.0 4     15
Tagihan akseptasi                                           113999397.0 110787114.0 5     16
Tagihan akseptasi pihak ketiga                              -38848157.0 -35017982.0 5     17
Tagihan akseptasi pihak berelasi                            NaN         NaN         5     18
Tagihan derivatif                                           NaN         NaN         6     19
Tagihan derivatif pihak ketiga                              NaN         NaN         6     20
Pinjaman yang diberikan                                     NaN         NaN         7     21
Pinjaman yang diberikan pihak ketiga                        NaN         NaN         7     22
Pinjaman yang diberikan pihak berelasi                      NaN         NaN         7     23
Cadangan kerugian                                           NaN         NaN         7     24

И затем я хочу выполнить последний код для переноса столбца,

df = df.apply(lambda row: df.shift(row.at['shift']).iloc[row.at['index']], 
axis='columns')
df[list(match)] = np.nan

Но, возникает проблема .. он так говорит. но я был проверен, что тип df ['index'] - int64. Почему в этом столбце нельзя применить iloc?

TypeError                                 Traceback (most recent call last)
<ipython-input-67-0f4a937e0002> in <module>()
----> 1 df = df.apply(lambda row: df.shift(row.at['shift']).iloc[row.at['index']], 
axis='columns')
2 df[list(match)] = np.nan
/usr/local/lib/python3.6/dist-packages/pandas/core/indexing.py in _getitem_axis(self, key, axis)
1491             key = item_from_zerodim(key)
1492             if not is_integer(key):
-> 1493                 raise TypeError("Cannot index by location index with a non-integer key")
1494 
1495             # validate the location
TypeError: Cannot index by location index with a non-integer key

Как решить проблему и получить желаемый df1? кто-нибудь может это решить?

0
M Rifky Ferdiand 11 Ноя 2020 в 14:15

1 ответ

Лучший ответ

Теперь я понимаю, в чем проблема. Если вы посмотрите на результат

match = df['Keterangan'].str.fullmatch('|'.join(entry for entry in my_list))
df['shift'] = match.cumsum()
df['index'] = df.index
columns = df.columns
df = df.apply(lambda row: print(row), axis='columns')

Вы увидите что-то вроде

Q2 2019    22686796.0
Q2 2018    27421625.0
shift             0.0
index             0.0
Name: Kas, dtype: float64

Q2 2019    68409507.0
Q2 2018    71159442.0
shift             0.0
index             1.0
Name: Giro pada bank indonesia, dtype: float64

Q2 2019    15675129.0
Q2 2018    12584938.0
shift             1.0
index             2.0
Name: Giro pada bank lain, dtype: float64
...

Строки представляют собой Серии с унифицированным типом, который здесь float64.

Из документации:

В функцию передаются объекты серии ...

Еще несколько моментов. Если вы посмотрите на простые примеры

df = pd.DataFrame({'A': [1, 2], 'B': [1., 2.]})
print(df.iloc[0], 'w')

df = pd.DataFrame({'A': ['a', 'b'], 'B': [1., 2.]})
print(df.iloc[0])

Вы увидите следующий вывод

A    1.0
B    1.0
Name: 0, dtype: float64

A    a
B    1
Name: 0, dtype: object

Обе серии. В первом Pandas видит, что все типы являются числовыми, поэтому он выбирает лучший числовой тип для размещения типов обоих значений, а именно float. Во втором, из-за строки, Pandas выбирает object, который вмещает почти все типы.

В DataFrame из вашего другого вопроса есть строка в столбцах 2. и 3. ('Nan', а не NaN!), что приводит к типу object, а в дальнейшем также к типу {{X3} } в переменных row в apply. DataFrame здесь имеет tpye float в столбцах 2. и 3. (тип NaN - float) и, следовательно, также float в переменных row . По этой причине исходный код работал для первого примера, но не здесь. (По крайней мере, я так думаю, я могу ошибаться.)

Я скорректировал код в своем предложении соответственно (int приведение).

1
Timus 11 Ноя 2020 в 15:20