Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫:遍历列,如果出现nan值,则将剩余列值发送到新列_Python_Pandas_Dataframe_Nan - Fatal编程技术网

Python 熊猫:遍历列,如果出现nan值,则将剩余列值发送到新列

Python 熊猫:遍历列,如果出现nan值,则将剩余列值发送到新列,python,pandas,dataframe,nan,Python,Pandas,Dataframe,Nan,如果我有一个数据帧作为 Index values 1 2 2 4 3 3 4 nan 5 nan 6 nan 7 9 8 7 9 8 10 nan 11 5 12 1 13 6 如何在新的数据帧中为每个值不同于nan的向量设置新列? 解决方案如下所示: Inde

如果我有一个数据帧作为

Index     values
1          2
2          4
3          3
4          nan
5          nan
6          nan
7          9 
8          7
9          8
10         nan
11         5
12         1
13         6
如何在新的数据帧中为每个值不同于nan的向量设置新列? 解决方案如下所示:

Index     values_1     values_2     values_3
1            2            9            5
2            4            7            1
3            3            8            6
您可以获取空值的总和以分成组,这就是创建列的方式。这是因为它对非空行返回False,因此当您获取累计值时,您将第一个组全部作为组0,其他组也将被分成不同的组ID。 空行用于步骤1的逻辑,但不再需要,所以请使用dropna 现在,重置组号,使其为1,2,3,带有df['col1'].nedf['col1'].shift.cumsum 您还必须使用df1.groupby'col1.cumcount+1创建一个新索引,以便使行位于同一行上。 然后,只需定义索引和列。 最后,用最后一行代码将列名清理到一个级别。 您可以获取空值的总和以分成组,这就是创建列的方式。这是因为它对非空行返回False,因此当您获取累计值时,您将第一个组全部作为组0,其他组也将被分成不同的组ID。 空行用于步骤1的逻辑,但不再需要,所以请使用dropna 现在,重置组号,使其为1,2,3,带有df['col1'].nedf['col1'].shift.cumsum 您还必须使用df1.groupby'col1.cumcount+1创建一个新索引,以便使行位于同一行上。 然后,只需定义索引和列。 最后,用最后一行代码将列名清理到一个级别。
我们可以使用布尔值创建一个新索引,然后使用unstack和add_前缀


我们可以使用布尔值创建一个新索引,然后使用unstack和add_前缀


如果值的数量不同,会发生什么情况?例如,在第二组的最后8行之后添加新行?如果值的数量不同,会发生什么情况?例如,在第二组的最后8行之后添加新行?啊,谢谢@Manakin@Manakin这是真的。我还必须这样做。droplevel0,axis=1,例如添加前缀“values”。droplevel0,axis=1我收到一个错误:“DataFrame”对象没有属性“droplevel”。我试过使用python 3.5和3.7。熊猫版是0.23.4aah谢谢@Manakin@Manakin这是真的。我还必须这样做。droplevel0,axis=1,例如添加前缀“values”。droplevel0,axis=1我收到一个错误:“DataFrame”对象没有属性“droplevel”。我试过使用python 3.5和3.7。熊猫版是0.23.4Nice+1,比我现在修好的版本干净了一点:@FJ35不客气。别忘了接受对你最有帮助的答案——我建议David的答案,因为他为你提供了大量的细节。我发现一个错误:“DataFrame”对象没有属性“droplevel”。我试过使用python 3.5和3.7。熊猫的版本是0.23。4@FJ35droplevel从0.24开始进入熊猫API,你能升级吗?不错+1,比我现在修好的更干净一点:@FJ35,非常欢迎。别忘了接受对你最有帮助的答案——我建议David的答案,因为他为你提供了大量的细节。我发现一个错误:“DataFrame”对象没有属性“droplevel”。我试过使用python 3.5和3.7。熊猫的版本是0.23。4@FJ35droplevel从0.24引入熊猫API,您可以升级吗?
# df1 = df1.drop('Index', axis=1) #include this line of code if "Index" is a column. Otherwise, omit.
df['col1'] = (df['values'].isnull().cumsum())
df = df.dropna()
df['col1'] = (df['col1'].ne(df['col1'].shift())).cumsum()
df['col2'] = df.groupby('col1').cumcount()
df = (df.pivot(index='col2', columns='col1').reset_index(drop=True)
        .add_prefix('values_').droplevel(0, axis=1))
# can also use # df.columns = [f'{col[0]}_{col[1]}' for col in df.columns] # instead of # .add_prefix('values_').droplevel(0, axis=1))
df
Out[1]: 
   values_1  values_2  values_3
0       2.0       9.0       5.0
1       4.0       7.0       1.0
2       3.0       8.0       6.0
df['key'] = ((df['values'].isna()==True) & 
            (df['values'].shift(1).isna()==False)).cumsum() + 1

df = df.dropna()

df1 = df.set_index([df.groupby(['key']).cumcount(),'key'])\
        .unstack(1)\
        .add_prefix('values_')\
        .droplevel(0,1)


print(df1)

key  values_1  values_2  values_3
0         2.0       9.0       5.0
1         4.0       7.0       1.0
2         3.0       8.0       6.0