python 按名称合并行并对所有行求和

pes8fvy9  于 2023-02-15  发布在  Python
关注(0)|答案(1)|浏览(177)

我有一个从Tableau导入的文件,我已经手动转换过了(为了去除代码中无法处理的特殊字符和不需要的列)。
我想做的是不必手动处理它,但我找不到解决方案。
从原来的Excel文件,我只需要三列我会命名为A,B和C一旦你删除所有无用的列,它会看起来像这样的东西(我不写其他列,但我们必须摆脱他们)。

    • 重要提示:在列C中,它不是空格,而是一个特殊字符:**

| A类|乙|C级|
| - ------|- ------|- ------|
| 项目名称|参考文献1|一百一十一元|
| * 与上述细胞融合 | 与上述细胞融合 *|15 214美元|
| * 与上述细胞融合 | 与上述细胞融合 *|462 134美元|
| * 与上述细胞融合 | 与上述细胞融合 *|七万零九百元|
| 项目名称2|参考文献2|787 741美元|
| * 与上述细胞融合 | 与上述细胞融合 *|四万一千四百一十四元|
| * 与上述细胞融合 | 与上述细胞融合 *|462 134美元|
| * 与上述细胞融合 | 与上述细胞融合 *|四千五百元|
| * 与上述细胞融合 | 与上述细胞融合 *|二千四百一十五元|
| 项目名称3|参考文献3|一百一十一元|
| 项目名称4|参考文献4|六十四万二千八百七十四元|

    • 编辑:融合细胞截图:**


在最终文件中,我需要通过对C volumn中的值求和,使所有行成为一行,并将结果放在指示项目名称的行中。
提前感谢您的建议!
下面是我转换文件的实际代码(是的,我导入了一个csv,但原始文件是Excel,csv是在我手动转换Excel文件之后:

elif typeOfFile == "9":
     #Import Excel file
     DataMonthly = pd.read_csv (filename, usecols = ['A', 'B', 'C'], sep=';')

     # Select only Wanted Data
     df=pd.DataFrame(DataMonthly)

     #Create a "DPAC" column and fill it with the specified code of the entity
     df['DPAC'] = 'code'
     firstCol = df.pop('DPAC')
     df.insert(0, 'DPAC', firstCol)

     #Create an 'Item' Column
     df['Item'] = np.nan
     firstCol = df.pop('Item')
     df.insert(1, 'Item', firstCol)

     df.columns.values[2] = 'A'
     df.columns.values[3] = 'B'

     #Create a 'Segment' Column
     df['Segment'] = ''
     firstCol = df.pop('Segment')
     df.insert(4, 'Segment', firstCol)

     #Create an 'EndCustomerCountry' Column
     df['EndCustomerCountry'] = ''
     firstCol = df.pop('EndCustomerCountry')
     df.insert(5, 'EndCustomerCountry', firstCol)

     df.columns.values[6] = 'C'

     #Create a 'SubSegment' Column
     df['SubSegment'] = ''
     firstCol = df.pop('SubSegment')
     df.insert(7, 'SubSegment', firstCol)

     #Create a 'TechnologyName' Column
     df['TechnologyName'] = ''
     firstCol = df.pop('TechnologyName')
     df.insert(8, 'TechnologyName', firstCol)

     #Define cols
     new_cols = ['DPAC', 'Item', 'A', 'B', 'Segment', 'EndCustomerCountry', 'C', 'SubSegment', 'TechnologyName']
     df=df.reindex(columns=new_cols)

     #Clean "C" column
     df['C'] = df['C'].str.replace(r'\s', '')
     df['C'] = df['C'].str[1:]
     print(df['C'])

     # aggregation_functions = {'C': 'sum'}
     # df = df.groupby(df['B']).aggregate(aggregation_functions)

     #Create Dataframe
     df = pd.DataFrame(data=df).reset_index(drop=True)

     if file_exists:
         df.to_csv ('C:/Program Files/Data_Arranger/Output Files/Monthly.csv', mode='a', header=False, index=False)
     else:
          df.to_csv ('C:/Program Files/Data_Arranger/Output Files/Monthly.csv', mode='a', header=True, index=False)
xwbd5t1u

xwbd5t1u1#

假设您通过读取Excel/CSV文件获得的 Dataframe df类似于

df = pd.DataFrame({
    "A": ["project1", np.NaN, np.NaN, "project2", np.NaN],
    "B": ["reference1", np.NaN, np.NaN, "reference2", np.NaN],
    "C": ["$111 111", "$15 214", "$462 134", "$70 900", "$787 741"],
})
A           B         C
0  project1  reference1  $111 111
1       NaN         NaN   $15 214
2       NaN         NaN  $462 134
3  project2  reference2   $70 900
4       NaN         NaN  $787 741

你可以试试

res = (
    df
    .assign(C=df["C"].str.replace("[\$\s]", "", regex=True).astype("int"))
    .groupby(df["A"].notna().cumsum(), as_index=False)
    .agg({"A": "first", "B": "first", "C": "sum"})
)

得到

A           B       C
0  project1  reference1  588459
1  project2  reference2  858641

相关问题