[英]How do I put data from one column into separate columns
我有一列数据:
Item
NaN
item_a
description_a
price_a
NaN
item_b
description_b
price_b
NaN
item_c
description_c
price_c
这都在同一列Item
中。 列中到处都有一个 NaN,我想把它下面的数据放在一个单独的列中。
像这样:
Item1 Item2 Item3
item_a item_b item_c
description_a description_b description_c
price_a price_b price_c
有没有办法只在NaN
上转置它? 还是我错过了一些简单的东西?
一些 boolean 语句和 unstack 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
您应该提供更好的示例和更多详细信息。 您知道行中 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()
output:
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 traspose(l):
b = []
c = []
for i in l:
if i != i:
if c == []:
continue
b += [c]
c = []
continue
c += [i]
if i == a[-1]:
b += [c]
return b
a = [
float('NaN'), 'item_a', 'description_a', 'price_a',
float('NaN'), 'item_b', 'description_b', 'price_b',
float('NaN'), 'item_c', 'description_c', 'price_c'
]
print(traspose(a))
Output:
[['item_a', 'description_a', 'price_a'],
['item_b', 'description_b', 'price_b'],
['item_c', 'description_c', 'price_c']]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.