如何在数据框中创建新列并将它们全部分配为 0?
How to create new columns in a dataframe and assign them all with 0?
我正在使用此语法预分配列并将 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
有没有什么方法可以用更少的代码行来做同样的事情?
在 python 中使用 pandas。
谢谢!
假设您的列名在列表中,我们创建一个字典,其中键作为列名,0 作为值。然后我们对 df1 进行 caretersian 连接。
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
最起码,你还是要写出所有新列的名称。
您可以使用循环:
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)
测试一下对于您的用例来说哪个速度更快。
您可以使用关键字参数解包 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
我正在使用此语法预分配列并将 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
有没有什么方法可以用更少的代码行来做同样的事情?
在 python 中使用 pandas。
谢谢!
假设您的列名在列表中,我们创建一个字典,其中键作为列名,0 作为值。然后我们对 df1 进行 caretersian 连接。
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
最起码,你还是要写出所有新列的名称。
您可以使用循环:
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)
测试一下对于您的用例来说哪个速度更快。
您可以使用关键字参数解包 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