【问题标题】:How to parse excel data and modify it into needed dataframe?如何解析excel数据并将其修改为所需的数据框?
【发布时间】:2021-08-19 13:58:05
【问题描述】:

我有一个如下所示的 excel:

像数据框一样使用它:

    ItemName     Category  Quantity
0   ProductA  Electronics       NaN
1          A  Electronics       1.0
2          B  Electronics       2.0
3          C  Electronics       3.0
4          D  Electronics       4.0
5          E  Electronics       5.0
6          F  Electronics       6.0
7   ProductB     Hardware       NaN
8          G     Hardware       7.0
9          H     Hardware       8.0
10         I     Hardware       9.0
11         J     Hardware      10.0
12  ProductC     Software       NaN
13         K     Software      11.0
14         L     Software      12.0

任何类别的第一个项目名称是项目类别。我需要将这个项目类(ProductA、ProductB 和 ProductC)从数据中分离出来,这样当我调用 df['ProductA'] 时,我可以将所有相关信息打印到这个项目名称中。 (A、B、C、D、E 和 F)

到目前为止,我已经尝试过从数据中提取产品 A、B 和 C。

import pandas as pd
import numpy as np
df = pd.read_excel(r'testing.xlsx')

index = df['Quantity'].index[df['Quantity'].apply(np.isnan)]
index_list=index.values.tolist()

for index in index_list:
    print(df['ItemName'][index])

但是如何修改代码以便调用 df['ProductA'] 并获取所有相关信息?

【问题讨论】:

    标签: python python-3.x excel pandas dataframe


    【解决方案1】:

    您可以使用以下代码创建一个名为“ProductClass”的列。

    import pandas as pd
    import numpy as np
    
    df = pd.read_excel('Products.xlsx')
    
    df['ProductClass'] = np.where(df['Quantity'].isna(), df['ItemName'], np.nan)
    
    df['ProductClass']= df['ProductClass'].ffill()
    
    df = df.dropna().reset_index().drop('index', axis=1)
    

    然后您可以像这样获取产品类的所有行。

    print(df[df['ProductClass'] == 'ProductA'])
    
    OUTPUT
      ItemName     Category  Quantity ProductClass
    0        A  Electronics       1.0     ProductA
    1        B  Electronics       2.0     ProductA
    2        C  Electronics       3.0     ProductA
    3        D  Electronics       4.0     ProductA
    4        E  Electronics       5.0     ProductA
    5        F  Electronics       6.0     ProductA
    

    【讨论】:

    • 感谢@norie,但是如果例如 ProductA 名称更改为 DeviceA?商品不必包含“产品”字样
    • 我已更改代码以根据 Quantity 列获取产品类别为 NA,这是一个合理的假设吗?
    【解决方案2】:

    试试这个:

    import pandas as pd
    import numpy as np
    df = pd.read_excel(r'testing.xlsx')
    
    index = df['Quantity'].index[df['Quantity'].apply(np.isnan)]
    index_list=index.values.tolist()
        
        
    dct = {}
    
    for i in range(len(index_list)):
        print(df['ItemName'][index_list[i]])
        if i+1 != len(index_list):
            dct[df['ItemName'][index_list[i]]] = df.iloc[(index_list[i]+1):index_list[i+1], :]
        else:
            dct[df['ItemName'][index_list[i]]] = df.iloc[(index_list[i]+1):len(df), :]
        
    
    print(dct['ProductA'])
    print(dct['ProductB'])
    print(dct['ProductC'])
    

    【讨论】:

    • @norie,这是你的答案吗?
    猜你喜欢
    • 2021-12-03
    • 2015-07-24
    • 1970-01-01
    • 1970-01-01
    • 2013-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多