Как я могу получить доступ к определенным столбцам в DataFrame на основе списка? - PullRequest
1 голос
/ 11 октября 2019

Я создал DataFrame:

import pandas as pd
import random
data = [[random.uniform(0, 1), random.uniform(0, 1), random.uniform(0, 1), random.uniform(0, 1), random.uniform(0, 1)], [random.uniform(0, 1), random.uniform(0, 1), random.uniform(0, 1), random.uniform(0, 1), random.uniform(0, 1)], [random.uniform(0, 1), random.uniform(0, 1),random.uniform(0, 1),random.uniform(0, 1),random.uniform(0, 1)], [random.uniform(0, 1), random.uniform(0, 1), random.uniform(0, 1), random.uniform(0, 1), random.uniform(0, 1)], [random.uniform(0, 1), random.uniform(0, 1), random.uniform(0, 1), random.uniform(0, 1), random.uniform(0, 1)], [random.uniform(0, 1), random.uniform(0, 1),random.uniform(0, 1),random.uniform(0, 1),random.uniform(0, 1)]]
df= pd.DataFrame(data, columns=["A","B", "C", "D", "E"])

DataFrame выглядит следующим образом:

          A         B         C         D         E
0  0.736739  0.184075  0.727951  0.173798  0.184594
1  0.047031  0.567518  0.103112  0.094116  0.050785
2  0.955045  0.754968  0.235842  0.710304  0.109404
3  0.426293  0.617942  0.304042  0.043034  0.798327
4  0.415225  0.461497  0.263462  0.621364  0.974682
5  0.936775  0.822425  0.073169  0.634906  0.140092

Теперь я хочу разделить определенные столбцы, например, на 2. ВВ этом случае я хотел бы разделить столбцы B, D и E на два. Для этого я бы хотел использовать список. Так как в моей настоящей проблеме «Индексы» - это имена Equity, а те, которые я хотел бы разделить, сохраняются в списке.

Вот что я пытался:

list = ["B", "D", "E"]
df1 = df[df.columns.intersection(list)] *0.5
print(df1)

И результат выглядитвот так:

          B         D         E
0  0.092038  0.086899  0.092297
1  0.283759  0.047058  0.025392
2  0.377484  0.355152  0.054702
3  0.308971  0.021517  0.399164
4  0.230749  0.310682  0.487341
5  0.411212  0.317453  0.070046

Но я получаю только DataFrame, который содержит только столбцы из списка. Я хотел бы, чтобы мой результат содержал новое вычисленное значение плюс старые значения из столбцов, которых не было в списке.

Результат должен выглядеть следующим образом:

          A         B         C         D         E
0  0.736739  0.092038  0.727951  0.086899  0.092297
1  0.047031  0.283759  0.103112  0.047058  0.025392
2  0.955045  0.377484  0.235842  0.355152  0.054702
3  0.426293  0.308971  0.304042  0.021517  0.399164
4  0.415225  0.230749  0.263462  0.310682  0.487341
5  0.936775  0.411212  0.073169  0.317453  0.070046

Кто-нибудь знает как я могу решить эту проблему? Ваша помощь очень ценится.

С уважением!

Ответы [ 5 ]

5 голосов
/ 11 октября 2019

Попробуйте:

df[['B','D','E']] = df[['B','D','E']]*0.5

@ метасомит указал в предложенном редактировании упрощение, используя *=

df.loc[:, ['B', 'D', 'E']] *= 0.5, 

df, теперь выглядит так:

    A           B           C           D           E
0   0.736739    0.092037    0.727951    0.086899    0.092297
1   0.047031    0.283759    0.103112    0.047058    0.025392
2   0.955045    0.377484    0.235842    0.355152    0.054702
3   0.426293    0.308971    0.304042    0.021517    0.399164
4   0.415225    0.230748    0.263462    0.310682    0.487341
5   0.936775    0.411212    0.073169    0.317453    0.070046
1 голос
/ 11 октября 2019

DataFrame.mul(Series)

# Can generalize to different numbers for each column.  
s = pd.Series(0.5, index=['B', 'D', 'E'])

# `reindex` as DataFrame.mul(Series) hasn't implemented `fill_value`
df.mul(s.reindex(df.columns).fillna(1))

          A         B         C         D         E
0  0.736739  0.092037  0.727951  0.086899  0.092297
1  0.047031  0.283759  0.103112  0.047058  0.025393
2  0.955045  0.377484  0.235842  0.355152  0.054702
3  0.426293  0.308971  0.304042  0.021517  0.399164
4  0.415225  0.230749  0.263462  0.310682  0.487341
5  0.936775  0.411212  0.073169  0.317453  0.070046
1 голос
/ 11 октября 2019

Вы можете использовать функцию назначения, как показано ниже

import pandas as pd
import random
data = [[random.uniform(0, 1), random.uniform(0, 1), random.uniform(0, 1), random.uniform(0, 1), random.uniform(0, 1)], [random.uniform(0, 1), random.uniform(0, 1), random.uniform(0, 1), random.uniform(0, 1), random.uniform(0, 1)], [random.uniform(0, 1), random.uniform(0, 1),random.uniform(0, 1),random.uniform(0, 1),random.uniform(0, 1)], [random.uniform(0, 1), random.uniform(0, 1), random.uniform(0, 1), random.uniform(0, 1), random.uniform(0, 1)], [random.uniform(0, 1), random.uniform(0, 1), random.uniform(0, 1), random.uniform(0, 1), random.uniform(0, 1)], [random.uniform(0, 1), random.uniform(0, 1),random.uniform(0, 1),random.uniform(0, 1),random.uniform(0, 1)]]
df= pd.DataFrame(data, columns=["A","B", "C", "D", "E"])

lst = ["B", "D", "E"]

df.assign(**{col:df[col]*0.5 for col in lst})
1 голос
/ 11 октября 2019

сначала создайте копию исходного кадра данных, чтобы не изменять это:

df1=df.copy()

Затем можно использовать DataFrame.mul или *:

df1[['B','D','E']] = df1[['B','D','E']].mul(0.5)

Также DataFrame.div или /

df1[['B','D','E']] = df1[['B','D','E']].div(2)
0 голосов
/ 11 октября 2019

Мне нравится решать это в цикле for, перебирая список, содержащий имя столбца. Вы также можете использовать его, чтобы добавить их с новым именем (Метод 2):

data = [[random.uniform(0, 1), random.uniform(0, 1), random.uniform(0, 1), random.uniform(0, 1), random.uniform(0, 1)], [random.uniform(0, 1), random.uniform(0, 1), random.uniform(0, 1), random.uniform(0, 1), random.uniform(0, 1)], [random.uniform(0, 1), random.uniform(0, 1),random.uniform(0, 1),random.uniform(0, 1),random.uniform(0, 1)], [random.uniform(0, 1), random.uniform(0, 1), random.uniform(0, 1), random.uniform(0, 1), random.uniform(0, 1)], [random.uniform(0, 1), random.uniform(0, 1), random.uniform(0, 1), random.uniform(0, 1), random.uniform(0, 1)], [random.uniform(0, 1), random.uniform(0, 1),random.uniform(0, 1),random.uniform(0, 1),random.uniform(0, 1)]]
df= pd.DataFrame(data, columns=["A","B", "C", "D", "E"])
cols = ["B","D","E"]
print(df)
for i in cols:
    df[i] = df[i] * 0.5
print(df)

Исходный кадр данных (первая печать):

          A         B         C         D         E
0  0.245053  0.265646  0.379884  0.125120  0.244205
1  0.900575  0.340778  0.470371  0.201992  0.316867
2  0.286503  0.524801  0.904360  0.214806  0.841444
3  0.535986  0.345602  0.863335  0.607875  0.493185
4  0.950249  0.462833  0.419088  0.948236  0.476547
5  0.162888  0.672005  0.554368  0.494376  0.913913

Второй кадр данных (вторая печать):

          A         B         C         D         E
0  0.245053  0.132823  0.379884  0.062560  0.122103
1  0.900575  0.170389  0.470371  0.100996  0.158434
2  0.286503  0.262400  0.904360  0.107403  0.420722
3  0.535986  0.172801  0.863335  0.303937  0.246592
4  0.950249  0.231416  0.419088  0.474118  0.238273
5  0.162888  0.336002  0.554368  0.247188  0.456957

Метод 2:

for i in cols:
    df["new "+i] = df[i] * 0.5
print(df)

Выход:

          A         B         C         D         E     new B     new D     new E
0  0.735067  0.213327  0.416205  0.235860  0.094208  0.106664  0.117930  0.047104
1  0.150027  0.524437  0.393283  0.783323  0.520855  0.262218  0.391661  0.260428
2  0.146858  0.328530  0.288445  0.101783  0.286224  0.164265  0.050892  0.143112
3  0.512124  0.302685  0.062246  0.152522  0.536951  0.151343  0.076261  0.268476
4  0.358646  0.928946  0.766012  0.808933  0.002960  0.464473  0.404466  0.001480
5  0.735067  0.436962  0.796247  0.499950  0.048898  0.218481  0.249975  0.024449
...