【问题标题】:How to create n-number of rows based off a total value如何根据总值创建 n 行数
【发布时间】:2022-12-31 03:17:54
【问题描述】:

我希望根据列表中的单个记录生成多行。

例如,我有一个 CSV 文件(例如文件A) 如下:

User ID Total Value Multiple Value Remaining Value
123 1007.25 11 7.25
456 804.25 9 4.25

我想创建另一个 CSV 文件(例如档案B) 像这样:

User ID Final Value
123 100.00
123 100.00
123 100.00
123 100.00
123 100.00
123 100.00
123 100.00
123 100.00
123 100.00
123 100.00
123 7.25
456 100.00
456 100.00
456 100.00
456 100.00
456 100.00
456 100.00
456 100.00
456 100.00
456 4.25

我尝试使用 pandas.concat 函数以及 for 循环,但我似乎无法让它正常工作(它出错了)。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    如果我正确理解逻辑,您可以在没有“多个值”和“剩余值”列的情况下执行此操作:

    import numpy as np
    import pandas as pd
    
    df = pd.read_clipboard() # Your df here
    
    df["Final Value"] = df["Total Value"].apply(lambda x: np.minimum(x - np.arange(0, x, 100), 100))
    
    out = df[["User ID", "Final Value"]].explode("Final Value")
    
       User ID Final Value
    0      123       100.0
    0      123       100.0
    0      123       100.0
    0      123       100.0
    0      123       100.0
    0      123       100.0
    0      123       100.0
    0      123       100.0
    0      123       100.0
    0      123       100.0
    0      123        7.25
    1      456       100.0
    1      456       100.0
    1      456       100.0
    1      456       100.0
    1      456       100.0
    1      456       100.0
    1      456       100.0
    1      456       100.0
    1      456        4.25
    

    【讨论】:

      【解决方案2】:

      这可能是一个解决方案:

      User_ID_List = df["User ID"].to_list()
      
      Multiple_Value_List = df["Multiple Value"].to_list()
      
      Remaining_Value_List = df["Remaining Value"].to_list()
      
      New_User_ID_List= []
      
      New_Multiple_Value_List = []
      
      
      for x in range(len(User_ID_List):
        Multiple_Value = Multiple_Value_List[x]
        for y in range(Multiple_Value):
           New_User_ID_List.append(User_ID_List[x])
           New_Multiple_Value_List.append(Multiple_Value_List[x])
        New_Multiple_Value_List.pop() 
        New_Multiple_Value_List.append(Remaining_Value_List[x])
      
      df = pd.DataFrame()
      df["User Id"] = New_User_ID_List
      df["Final Value"] = New_Multiple_Value_List
      

      【讨论】:

        【解决方案3】:

        也许是这样的?

        import numpy as np
        
        def spread(g):
            tot, rem, n = g[['Total Value', 'Remaining Value', 'Multiple Value']].squeeze()
            n -= 1
            val = (tot - rem) / n
            return np.r_[np.repeat(val, n), rem]
        
        out = df.groupby('User ID').apply(spread).explode()
        
        >>> out
        User ID
        123    100.0
        123    100.0
        123    100.0
        123    100.0
        123    100.0
        123    100.0
        123    100.0
        123    100.0
        123    100.0
        123    100.0
        123     7.25
        456    100.0
        456    100.0
        456    100.0
        456    100.0
        456    100.0
        456    100.0
        456    100.0
        456    100.0
        456     4.25
        

        【讨论】:

          猜你喜欢
          • 2016-11-11
          • 1970-01-01
          • 2012-06-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-03-02
          • 1970-01-01
          相关资源
          最近更新 更多