Как создать новые столбцы в кадре данных и назначить им все с 0? - PullRequest
3 голосов
/ 01 мая 2020

Я использую этот синтаксис для предварительного выделения столбцов и присваивания 0 всем им:

data['Base'] = 0
data['Base_Chg'] = 0
data['Base_5D_Chg'] = 0
data['Year_Low'] = 0
data['Year_High'] = 0
data['Market_Cap'] = 0
data['PE_Ratio'] = 0
data['SMA_50'] = 0
data['SMA_100'] = 0
data['SMA_200'] = 0
data['RSI'] = 0
data['ADX'] = 0
data['ATR'] = 0
data['STDEV'] = 0

Можно ли сделать то же самое с меньшим количеством строк кода?

Использование pandas in python.

Thx!

Ответы [ 3 ]

3 голосов
/ 01 мая 2020

Вы можете использовать распаковку аргумента с ключевым словом OrderedDict.

import collections as co

od = co.OrderedDict({'Base':0,'Base_Chg':0,'Base_5D_Chg':0})

data.assign(**od)

Результат:

In [18]: data.assign(**od)
Out[18]: 
   a  Base  Base_Chg  Base_5D_Chg
0  1     0         0            0
1  2     0         0            0
2  3     0         0            0
1 голос
/ 01 мая 2020

Как минимум, вам все равно нужно выписать имена всех новых столбцов.

Вы можете использовать al oop:

columns=['Base', 'Base_Chg', 'Base_5D_Chg', 'Year_Low', 'Year_High', 'Market_Cap', 'PE_Ratio', 'SMA_50', 'SMA_100', 'SMA_200', 'RSI', 'ADX', 'ATR', 'STDEV']
for col in columns:
    df[col] = 0

или pd.concat:

columns=['Base', 'Base_Chg', 'Base_5D_Chg', 'Year_Low', 'Year_High', 'Market_Cap', 'PE_Ratio', 'SMA_50', 'SMA_100', 'SMA_200', 'RSI', 'ADX', 'ATR', 'STDEV']
new_df = pd.DataFrame(0, columns=columns, index=df.index)
df = pd.concat([df, new_df], axis=1)

Проверьте, какой из них быстрее для вашего варианта использования.

1 голос
/ 01 мая 2020

при условии, что имена ваших столбцов находятся в списке, мы создаем словарь с ключом в качестве имени столбца, равным 0 в качестве значения. Затем мы выполняем присоединение к df1.

cols = ['Base', 
'Base_Chg', 
'Base_5D_Chg', 
'Year_Low', 
'Year_High', 
'Market_Cap', 
'PE_Ratio', 
'SMA_50', 
'SMA_100', 
'SMA_200', 
'RSI', 
'ADX', 
'ATR', 
'STDEV']

df1 = pd.DataFrame({'A' : [0,1,2,3]}) # your original dataframe.

df2 = pd.DataFrame(dict(zip(cols,[0] * len(cols))),index=[0]) 
#new dataframe from list of cols.

df3 = pd.merge(df1.assign(key='key'),df2.assign(key='key'),how='outer').drop('key',axis=1)
#merge of your old dataframe and new.

print(df1)
   A
0  0
1  1
2  2
3  3

print(df2)
   Base  Base_Chg  Base_5D_Chg  Year_Low  Year_High  Market_Cap  PE_Ratio  \
0     0         0            0         0          0           0         0   

   SMA_50  SMA_100  SMA_200  RSI  ADX  ATR  STDEV  
0       0        0        0    0    0    0      0  

print(df3)



   A  Base  Base_Chg  Base_5D_Chg  Year_Low  Year_High  Market_Cap  PE_Ratio  \
0  0     0         0            0         0          0           0         0   
1  1     0         0            0         0          0           0         0   
2  2     0         0            0         0          0           0         0   
3  3     0         0            0         0          0           0         0   

   SMA_50  SMA_100  SMA_200  RSI  ADX  ATR  STDEV  
0       0        0        0    0    0    0      0  
1       0        0        0    0    0    0      0  
2       0        0        0    0    0    0      0  
3       0        0        0    0    0    0      0  
...