繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM