python 如何基于总值创建n行

8ulbf1ek  于 2023-01-01  发布在  Python
关注(0)|答案(3)|浏览(92)

我希望从一个列表中的一条记录生成多行。
例如,我有一个CSV文件(如文件A),如下所示:
| 用户ID|总价值|多值|剩余值|
| - ------| - ------| - ------| - ------|
| 一百二十三|小行星1007.25|十一|七点二十五分|
| 四百五十六|小行星804.25|九|四点二五|
我想创建另一个CSV文件(例如File B),如下所示:
| 用户ID|最终值|
| - ------| - ------|
| 一百二十三|一百元|
| 一百二十三|一百元|
| 一百二十三|一百元|
| 一百二十三|一百元|
| 一百二十三|一百元|
| 一百二十三|一百元|
| 一百二十三|一百元|
| 一百二十三|一百元|
| 一百二十三|一百元|
| 一百二十三|一百元|
| 一百二十三|七点二十五分|
| 四百五十六|一百元|
| 四百五十六|一百元|
| 四百五十六|一百元|
| 四百五十六|一百元|
| 四百五十六|一百元|
| 四百五十六|一百元|
| 四百五十六|一百元|
| 四百五十六|一百元|
| 四百五十六|四点二五|
我试着使用pandom.concat函数和for循环,但似乎无法正常工作(它会出错)。

z9smfwbn

z9smfwbn1#

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

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
ryevplcw

ryevplcw2#

这可能是一个解决方案:

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
ej83mcc0

ej83mcc03#

也许像这样的东西?

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().to_frame('Final Value')

>>> out
        Final Value
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

然后:

>>> print(out.to_csv())
User ID,Final Value
123,100.0
123,100.0
...

或者更确切地说:out.to_csv(my_file_b)

相关问题