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的灵活性。