Python 如何将一列中的数据放入单独的列中

Python 如何将一列中的数据放入单独的列中,python,pandas,dataframe,Python,Pandas,Dataframe,我有一列数据: Item NaN item_a description_a price_a NaN item_b description_b price_b NaN item_c description_c price_c 这都在同一列项中。在列中有NaN的地方,我想把它下面的数据放在一个单独的列中 像这样: Item1 Item2 Item3 item_a item_b item_c descript

我有一列数据:

Item
NaN
item_a
description_a
price_a
NaN
item_b
description_b
price_b
NaN
item_c
description_c
price_c
这都在同一列
项中
。在列中有NaN的地方,我想把它下面的数据放在一个单独的列中

像这样:

Item1             Item2             Item3
item_a            item_b            item_c
description_a     description_b     description_c
price_a           price_b           price_c

有没有办法只在
NaN
上转置它?还是我遗漏了一些简单的东西?

你应该提供一个更好的例子和更多的细节。你知道你那一排的确切人数吗

from typing import List
import pandas as pd


def split_row(value: str) -> List[str]:
    tmp = value.split("NaN")
    return tmp[1:]


def run():

    # List of new columns, has to match the length of split_row list
    item_list = ["Item1", "Item2", "Item3"]

    df = pd.DataFrame({"Item": [""""NaN
item_a
description_a
price_a
NaN
item_b
description_b
price_b
NaN
item_c
description_c
price_c"""]})

    print(df)
    print("-" * 70)

    df[item_list] = df["Item"].apply(split_row).to_list()
    df.drop("Item", axis=1)

    pd.set_option("max_columns", None)  # To print all columns
    print(df)


if __name__ == '__main__':
    run()

输出:

                                                Item
0  "NaN\nitem_a\ndescription_a\nprice_a\nNaN\nite...
----------------------------------------------------------------------
                                                Item  \
0  "NaN\nitem_a\ndescription_a\nprice_a\nNaN\nite...   

                                Item1                               Item2  \
0  \nitem_a\ndescription_a\nprice_a\n  \nitem_b\ndescription_b\nprice_b\n   

                              Item3  
0  \nitem_c\ndescription_c\nprice_c  

这不是最好的解决方案,但它确实有效。下面的代码仅在每一列都以
NaN
开头时有效,这意味着“列”(我将其列为列表)的第一个值是
NaN

def传输(l):
b=[]
c=[]
对于l中的i:
如果我一:
如果c=[]:
持续
b+=[c]
c=[]
持续
c+=[i]
如果i==a[-1]:
b+=[c]
返回b
a=[
浮动('NaN')、'item_a'、'description_a'、'price_a',
浮动('NaN')、'item_b'、'description_b'、'price_b',
浮动('NaN'),'item_c','description_c','price_c'
]
印刷品(运输(a))
输出:

[['item\u a','description\u a','price\u a'],
[‘项目’、‘说明’、‘价格’],
['item_c'、'description_c'、'price_c']]

一些布尔语句和一个
unstack()
就可以了

df['item'] = np.where(df['Item'].str.contains('item',case=False),df['Item'],np.nan)
df['item'] = df['item'].ffill()

df1 = df.loc[df['item'].ne(df['Item'])].dropna()

df1['item_2'] = df1['item'].factorize()[0] + 1

df2 = df1.set_index([df1.groupby('item').cumcount(), 
              df1['item_2'],df1['item']])[['Item']].unstack([1,2]).droplevel(0,1)



print(df2)

item_2              1              2              3
item           item_a         item_b         item_c
0       description_a  description_b  description_c
1             price_a        price_b        price_c

只是一些友好的建议,Pandas API非常丰富,有很多内置函数,在使用vanilla python之前可以使用。其次,API的基础是用C编写的,在处理数据时速度非常快,因此当使用vanilla python时,会失去速度和API的灵活性。