Получить индекс столбца nr из значения в другом столбце - PullRequest
3 голосов
/ 17 марта 2020

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

У меня есть df как этот:

    Jan  Feb  Mar  Apr  i    j
a   100  200  250  100  1  0.3
b   120  130   90  100  3  0.7
c    10   30   10   20  2 0.25

Я хочу построить столбец, который принимает столбец с индексом в соответствии с df['i'], а затем умножает значение в выбранном столбце на значение в df['j']. Я хочу составить таблицу, подобную этой (df['k'] на основе построенного столбца):

    Jan  Feb  Mar  Apr  i    j    k
a   100  200  250  100  1  0.3   60
b   120  130   90  100  3  0.7   70
c    10   30   10   20  2 0.25  2.5

(строка a df['k']=200*0.3 (df['Feb']*df['j']), строка b df['k']=100*0.7 ( df['Apr']*df['j']) и в строке c df['k']=10*0.25 (df['Mar']*df['j']))

Значение в df['i'] всегда будет целочисленным значением, поэтому я хотел бы использовать положение столбца в соответствии с до значения в df['i'].

Ответы [ 3 ]

1 голос
/ 17 марта 2020

IIU C, DataFrame.rename и затем мы можем использовать DataFrame.lookup до map. Наконец, мы используем Series.mul

df['k'] = df['j'].mul(df.rename(columns = dict(zip(df.columns,
                                                   range(len(df.columns)))))
                        .lookup(df.index, df['i']))
print(df)

Выход

   Jan  Feb  Mar  Apr  i     j     k
a  100  200  250  100  1  0.30  60.0
b  120  130   90  100  3  0.70  70.0
c   10   30   10   20  2  0.25   2.5

Альтернатива:

df['j'].mul(df.iloc[:,df['i']].lookup(df.index, 
                                      df['i'].map(dict(zip(range(len(df.columns)),
                                                           df.columns)))))
0 голосов
/ 17 марта 2020

Другой вариант предоставленных решений:

   #convert column i to a list
     vals = df.i.tolist()

   #get the number indices for the dataframe
  num_indices = [df.index.get_loc(ind) for ind in df.index]
   # or df.index.get_indexer(df.index)

   #create a pair of the indices and vals
    paired = list(zip(num_indices,vals))

  #calculate column k by multiplying each extract with column j
   df['k'] = [df.iloc[entry] for entry in paired] * df.j

    Jan Feb Mar Apr i   j         k
a   100 200 250 100 1   0.30    60.0
b   120 130 90  100 3   0.70    70.0
c   10  30  10  20  2   0.25    2.5

Обновление : @ansev прав, l oop не требуется:

#get the column labels that correspond with the values in column i:
 col_labels = df.columns[df.i]
 #get the values from each column using pandas' lookup:
 result = df.lookup(df.index, col_labels)
 #multiply the array with column j:
 df['k'] = result * df.j
 #u can compress this in one line, but i believe breaking it down
 #allows for readability : 
 #df = df.assign(k = df.lookup(df.index,df.columns[df.i])*df.j)

    Jan Feb Mar Apr i   j        k
a   100 200 250 100 1   0.30    60.0
b   120 130 90  100 3   0.70    70.0
c   10  30  10  20  2   0.25    2.5
0 голосов
/ 17 марта 2020

У меня такое ощущение, что должен быть лучший способ, но вы можете использовать itertuples, например:

list_k = []
for row in df.itertuples():
  month = row[int(row[5]+1)] # Tuple indexing
  j = row[6]
  list_k.append(month * j)

df['k'] = list_k 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...