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