Python 使用tolist()函数填充固定数量(x)的新列,该函数有时包含较少的项(

Python 使用tolist()函数填充固定数量(x)的新列,该函数有时包含较少的项(,python,pandas,multiple-columns,tolist,Python,Pandas,Multiple Columns,Tolist,我使用tolist将一列“ModelGreens”中的8项列表拆分为同一数据帧中的8个新列: pd.DataFrame(df['modelGreeks'].tolist(), index=df.index) df[['IV_model', 59, 'Price_model', 61, 62, 63, 64, 'undPrice']] = pd.DataFrame(df['modelGreeks'].tolist(), index=df.index) 这是我通常在“ModelGreens”列中得

我使用tolist将一列“ModelGreens”中的8项列表拆分为同一数据帧中的8个新列:

pd.DataFrame(df['modelGreeks'].tolist(), index=df.index)
df[['IV_model', 59, 'Price_model', 61, 62, 63, 64, 'undPrice']] = pd.DataFrame(df['modelGreeks'].tolist(), index=df.index)
这是我通常在“ModelGreens”列中得到的列表:

(0.2953686167703842, -1.9317880628477724e-14, 1.4648640549124297e-15, 0.0, 6.240571011994176e-13, 1.1840837166645831e-15, -1.4648640549124297e-15, 10.444000244140625)
10次中有9次效果很好。但有时我通过API检索的数据并不完美/完整。它在该字段中提供了一个“None”值,而不是“modelGreens”列中包含8项的预期列表,并且我在第二个代码行的代码执行过程中从逻辑上得到以下错误消息,因为它试图用仅有1个可用值填充8列:

ValueError: Columns must be same length as key
我正在寻找一种解决方案,其中8个新列将被创建并填充,例如0或NaN或无

希望有人能帮忙。提前感谢你的努力

以下代码起作用:

df1 = pd.DataFrame(columns=['IV_model', 59, 'Price_model', 61, 62, 63, 64, 'undPrice','modelGreeks'])
df1['modelGreeks'] = [[None, None, None, None, None, None, None, None], None, None, None, None]
df1[['IV_model', 59, 'Price_model', 61, 62, 63, 64, 'undPrice']] = df1['modelGreeks'].apply(pd.Series)
它返回:

   IV_model  59  Price_model  61  62  63  64  undPrice  modelGreeks
0  NaN       NaN NaN          NaN NaN NaN NaN NaN       [None, None, None, None, None, None, None, None]
1  NaN       NaN NaN          NaN NaN NaN NaN NaN       None
2  NaN       NaN NaN          NaN NaN NaN NaN NaN       None
3  NaN       NaN NaN          NaN NaN NaN NaN NaN       None
4  NaN       NaN NaN          NaN NaN NaN NaN NaN       None
这很好。唯一的问题是,在某些时刻,我通过API从交互式代理接收的数据集只会在列model的所有行中提供标量None值。如果我将其应用于测试用例,那么我会再次收到错误消息ValueError:Columns的长度必须与key相同:

df1 = pd.DataFrame(columns=['IV_model', 59, 'Price_model', 61, 62, 63, 64, 'undPrice','modelGreeks'])
df1['modelGreeks'] = [None, None, None, None, None]
df1[['IV_model', 59, 'Price_model', 61, 62, 63, 64, 'undPrice']] = df1['modelGreeks'].apply(pd.Series)

Traceback (most recent call last):
File "/Users/floris/PycharmProjects/ib_insync/test1.py", line 9, in <module>
df1[['IV_model', 59, 'Price_model', 61, 62, 63, 64, 'undPrice']] = df1['modelGreeks'].apply(pd.Series)
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/pandas/core/frame.py", line 3367, in __setitem__
self._setitem_array(key, value)
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/pandas/core/frame.py", line 3389, in _setitem_array
raise ValueError('Columns must be same length as key')
ValueError: Columns must be same length as key

在这种情况下,我希望在8列中也只看到NaN值。

因为您要将得到的值转换为列表,我建议先检查列表的长度。如果小于8,则可以向其追加0。大概是这样的:

lst = df['modelGreeks'].tolist()
lst += [0]*(8 - len(lst))
df[['IV_model', 59, 'Price_model', 61, 62, 63, 64, 'undPrice']] = pd.DataFrame(np.array(lst).reshape(1,8), index=df.index)
我使用了np.array.reforme来确保没有形状不匹配错误。
如果我正确理解了你的问题,这可能会有所帮助。我相信一定有更酷的方法可以做到这一点,其他人可能会在这方面帮助你,但这也应该能完成任务。

你提出的第一个错误

ValueError:列的长度必须与键的长度相同

将在您提供的值与列数不匹配时输出

比如说,

import pandas as pd
d1 = {'teams': [['SF', 'NYG'],['SF', 'NYG'],['SF', 'NYG'],
                ['SF', 'NYG'],['SF', 'NYG'],['SF', 'NYG'],['SF', 'NYG']]}
df2 = pd.DataFrame(d1)
print (df2)

df2[['team1','team2', 'team3']] = pd.DataFrame(df2.teams.values.tolist(), index= df2.index)
print (df2)
在这种情况下,不需要“团队3”。只是smth上的一个reacap,你可能已经知道了

然后将列表中的最后一个条目替换为“无”:

d1 = {'teams': [['SF', 'NYG'],['SF', 'NYG'],['SF', 'NYG'],
                ['SF', 'NYG'],['SF', 'NYG'],['SF', 'NYG'],None]}
Produced error:
TypeError: object of type 'NoneType' has no len()
要删除None条目,只需执行以下操作:

df3 = df2.replace(to_replace='None', value=np.nan).dropna()
这应该不是问题,因为他们没有提供任何有价值的信息

作为最后一个示例,您可以使用smth,如:

import pandas as pd
import numpy as np

d1 = {'teams': [['SF', 'NYG'],['SF', 'NYG'],['SF', 'NYG'],
                ['SF', 'NYG'],['SF', 'NYG'],['SF', 'NYG'],None]}

df2 = pd.DataFrame(d1)
df3 = df2.replace(to_replace='None', value=np.nan).dropna()

df2[['team1','team2']] = pd.DataFrame(df3.teams.values.tolist(), index= df3.index)
print (df2)
这将产生:

       teams team1 team2
0  [SF, NYG]    SF   NYG
1  [SF, NYG]    SF   NYG
2  [SF, NYG]    SF   NYG
3  [SF, NYG]    SF   NYG
4  [SF, NYG]    SF   NYG
5  [SF, NYG]    SF   NYG
6       None   NaN   NaN

希望这对您有用,如果您需要帮助将其应用到示例中,请告诉我。

不要创建新的数据帧,而是将列表列转换为一个系列:

df[['IV_model', 59, 'Price_model', 61, 62, 63, 64, 'undPrice']] = df['modelGreeks'].apply(pd.Series)
测试:

输出:

   IV_model   59  Price_model  ...   64  undPrice                     modelGreeks
0       1.0  2.0          3.0  ...  7.0       8.0        [1, 2, 3, 4, 5, 6, 7, 8]
1       1.0  2.0          NaN  ...  7.0       8.0     [1, 2, None, 4, 5, 6, 7, 8]
2       1.0  2.0          3.0  ...  7.0       NaN           [1, 2, 3, 4, 5, 6, 7]
3       NaN  NaN          NaN  ...  NaN       NaN                          [None]
4       NaN  NaN          NaN  ...  NaN       NaN                            None
5       NaN  NaN          NaN  ...  NaN       NaN  [None, None, None, None, None]

谢谢,这无疑是朝着正确的方向迈出的一步,还有一个小小的障碍,我遇到了以下错误:ValueError:无法将大小为512的数组重塑为形状1,8我不明白,您想做什么:使用列ModelGreens的数据框和使用列'IV_model',59'Price_model',61、62、63、64的数据框,“undPrice”应该是不同的数据帧,但在您的问题中它们都表示为df?我想将现在在“ModelGreens”字段中组合的8个数据点传输到同一数据帧中的8个单独列中,以供以后使用。谢谢,它在所有情况下都有效,除了:当第2行中的所有5个元素都为[None]时。在这种情况下,我仍然会得到错误:ValueError:Columns的长度必须与key的长度相同。关于这可能如何工作的想法:df['modelGreens']=[[None]、[None]、[None]、[None]、[None]、[None]、[None]]我在测试行5中添加了这个案例:它适用于我的pandas 0.24.2。我刚刚看到你说的是[[None]、[None]、[None]、[None]、[None]、[None]、[None]、[None,None,None,None,None],但前者也起作用,并导致第1..5列中的[None]和第6..8列中的NaN。但为什么我们突然谈论5个值,在你的问题中你说8和IIUC,它要么是一个8个值的列表,要么只是一个标量无值,即没有列表?
   IV_model   59  Price_model  ...   64  undPrice                     modelGreeks
0       1.0  2.0          3.0  ...  7.0       8.0        [1, 2, 3, 4, 5, 6, 7, 8]
1       1.0  2.0          NaN  ...  7.0       8.0     [1, 2, None, 4, 5, 6, 7, 8]
2       1.0  2.0          3.0  ...  7.0       NaN           [1, 2, 3, 4, 5, 6, 7]
3       NaN  NaN          NaN  ...  NaN       NaN                          [None]
4       NaN  NaN          NaN  ...  NaN       NaN                            None
5       NaN  NaN          NaN  ...  NaN       NaN  [None, None, None, None, None]