Проанализируйте данные и сделайте заголовок этой группы. Python3, панды

Я разбираю .csv файл (пример файла можно посмотреть здесь). Я извлекаю данные 2-й и 7-й строк. Нет проблем с этим. вот как я это делаю.

import pandas as pd
import numpy as np

df = pd.read_csv("datas.csv", index_col=0, header=None)
d = {'YSS':'Yahoo!リスティング 12月分 12/1〜12/31',
     'YDNRT':'Yahoo!リマーケティング 12月分 12/1〜12/31',
     'YDN':' Yahoo!ディスプレイネットワーク 12月分 12/1〜12/31',
     'GSN':'Googleリスティング 12月分 12/1〜12/31',
     'GDNRM':'Googleリマーケティング 12月分 12/1〜12/31',
     'GDN':'Googleディスプレイネットワーク 12月分 12/1〜12/31'}

pat = r'({})'.format('|'.join(d.keys()))
df.loc['アカウント名'] = df.loc['アカウント名'].str.extract(pat, expand=False).dropna().map(d)
df.loc['利用額(Fee抜き)'] = df.loc['利用額(Fee抜き)'].astype(str).apply(lambda x: x.split(".")[0])

df1 = df.loc[['アカウント名', '利用額(Fee抜き)']]
df1 = df1.T

df1.columns = ['項目','金額']

df1['数量'] = 1

df1['単位'] = "式"

df1['単価'] = np.nan

wow = df1[['項目','数量','単位','単価', '金額']]

newFile = wow.shift(1)

newFile['項目'] = newFile['項目'].fillna(df.loc['クライアント名'])

newFile.loc[newFile['項目'].str.contains('プレサンス'),['数量','単位','単価', '金額']] = ['','','','']

pos = newFile.index[newFile['項目'].str.contains('プレサンス')]

d = {}
i = 0
for p in pos:
    if p == pos[0]:
        d[p] = newFile.loc[:pos[i+1]-1].append(pd.Series('',newFile.columns), ignore_index=True)
    elif (i + 1) > len(pos) - 1:
        d[p] = newFile.loc[pos[i-1]+1:]
    else:
        d[p] = newFile.loc[p:pos[i+1]-1].append(pd.Series('',newFile.columns), ignore_index=True)
    i = i + 1
pd.concat(d, ignore_index=True)
p.to_csv('newfile.csv', index=False)

Создание нового файла .csv с новыми столбцами. Вы можете видеть это здесь. https://imgur.com/a/5w63Yht Но мне нужно сделать еще кое-что.

В исходном файла строка 1 содержит названия компаний. Я хочу проанализировать названия этих компаний и поместить их во главе каждой группы, как показано на рисунке: https://imgur.com/a/4T2WxYt также необходимо удалить общие суммы...

Хотя я не очень уверен, что это возможно или нет...


person Community    schedule 16.01.2019    source источник
comment
Вы пытаетесь добавить общую сумму для каждой группы?   -  person EdChum    schedule 16.01.2019
comment
нет, я не хочу добавлять общую сумму, на самом деле попробуйте удалить общую сумму @EdChum автоматически... но я не хочу этого...   -  person    schedule 16.01.2019
comment
Вы имеете в виду полное удаление или замену пустой строкой, поскольку ваше изображение показывает что-то отличное от того, что вы указали?   -  person EdChum    schedule 16.01.2019
comment
Если вы хотите удалить, вы можете сделать newFile = newFile.loc[~newFile['項目'].str.contains('プレサンス')], если вы хотите очистить эти значения, вам придется перезаписать существующие значения.   -  person EdChum    schedule 16.01.2019
comment
Судя по вашему второму изображению, это newFile.loc[~newFile['項目'].str.contains('プレサンス'),['数量','単位','単価', '金額']] = ['','','',''] должно было сработать.   -  person EdChum    schedule 16.01.2019
comment
Я обновил вопрос. теперь все должно быть в порядке. :) пожалуйста, проверьте это @EdChum   -  person    schedule 16.01.2019
comment
Извините, вы пытаетесь заменить пустую запись под '項目' новым текстом и удалить сумму? Что-то вроде newFile.loc[~newFile['項目'].str.len() == 0,['数量','単位','単価', '金額']] = ['','','',''], вам все равно придется генерировать новые значения   -  person EdChum    schedule 16.01.2019
comment
это правильно И также добавить тему. главный вопрос - добавить тему из строки 1 исходного файла, а также удалить эту сумму @EdChum   -  person    schedule 16.01.2019
comment
Ах, ладно, позвольте мне взглянуть, так что заменить пустым легко, как я показал, другой бит может зависеть от того, как организован ваш df, это всегда 6 строк?   -  person EdChum    schedule 16.01.2019
comment
Давайте продолжим обсуждение в чате.   -  person    schedule 16.01.2019
comment
обычно 6, но иногда и 2, вот в чем проблема @EdChum   -  person    schedule 16.01.2019
comment
Опубликовал мой ответ   -  person EdChum    schedule 16.01.2019


Ответы (1)


Вы можете заменить NaN для столбца '項目', проиндексировав исходный df и вызвав fillna, а затем отфильтровать строки, содержащие строку 'プレサンス', и перезаписать значения строки списком пустых строк, сначала мы shift строки вниз на 1, поэтому он делает заголовок:

In[111]:

newFile = df1.shift(1)
newFile['項目'] = newFile['項目'].fillna(df.loc['クライアント名'])
newFile.loc[newFile['項目'].str.contains('プレサンス'),['数量','単位','単価', '金額']] = ['','','','']
newFile
Out[111]: 
                                     項目      金額 数量 単位   単価
1                        プレサンス ロジェ 和泉中央                   
2      Yahoo!リスティング 12月分 12/1〜12/31 YSS   91188  1  式  NaN
3        Yahoo!リマーケティング 12月分 12/1〜12/31   25649  1  式  NaN
4    Yahoo!ディスプレイネットワーク 12月分 12/1〜12/31   13211  1  式  NaN
5          Googleリスティング 12月分 12/1〜12/31  131742  1  式  NaN
6        Googleリマーケティング 12月分 12/1〜12/31   35479  1  式  NaN
7    Googleディスプレイネットワーク 12月分 12/1〜12/31   18999  1  式  NaN
8                          プレサンス グラン 茨木                   
9      Yahoo!リスティング 12月分 12/1〜12/31 YSS  113373  1  式  NaN
10       Yahoo!リマーケティング 12月分 12/1〜12/31   28775  1  式  NaN
11   Yahoo!ディスプレイネットワーク 12月分 12/1〜12/31   19010  1  式  NaN
12         Googleリスティング 12月分 12/1〜12/31  158389  1  式  NaN
13       Googleリマーケティング 12月分 12/1〜12/31   45530  1  式  NaN
14   Googleディスプレイネットワーク 12月分 12/1〜12/31   23224  1  式  NaN
15                         プレサンス ロジェ 江坂  

Теперь, когда вы хотите добавить отступы, чтобы сделать его более читабельным, мы можем сохранить местоположения индекса, где находятся итоги, затем перебрать их и нарезать df, добавить их в dict, а затем вызвать concat для вертикального размещения заполненных фрагментов:

In[112]:

pos = newFile.index[newFile['項目'].str.contains('プレサンス')]
pos
Out[112]: Int64Index([1, 8, 15], dtype='int64')

теперь создайте dict каждого среза и добавьте пустую строку:

In[115]:

d = {}
i = 0
for p in pos:
    if p == pos[0]:
        d[p] = newFile.loc[:pos[i+1]-1].append(pd.Series('',newFile.columns), ignore_index=True)
    elif (i + 1) > len(pos) - 1:
        d[p] = newFile.loc[pos[i-1]+1:]
    else:
        d[p] = newFile.loc[p:pos[i+1]-1].append(pd.Series('',newFile.columns), ignore_index=True)
    i = i + 1
pd.concat(d, ignore_index=True)
Out[115]: 
                                     項目      金額 数量 単位   単価
0                        プレサンス ロジェ 和泉中央                   
1      Yahoo!リスティング 12月分 12/1〜12/31 YSS   91188  1  式  NaN
2        Yahoo!リマーケティング 12月分 12/1〜12/31   25649  1  式  NaN
3    Yahoo!ディスプレイネットワーク 12月分 12/1〜12/31   13211  1  式  NaN
4          Googleリスティング 12月分 12/1〜12/31  131742  1  式  NaN
5        Googleリマーケティング 12月分 12/1〜12/31   35479  1  式  NaN
6    Googleディスプレイネットワーク 12月分 12/1〜12/31   18999  1  式  NaN
7                                                         
8                          プレサンス グラン 茨木                   
9      Yahoo!リスティング 12月分 12/1〜12/31 YSS  113373  1  式  NaN
10       Yahoo!リマーケティング 12月分 12/1〜12/31   28775  1  式  NaN
11   Yahoo!ディスプレイネットワーク 12月分 12/1〜12/31   19010  1  式  NaN
12         Googleリスティング 12月分 12/1〜12/31  158389  1  式  NaN
13       Googleリマーケティング 12月分 12/1〜12/31   45530  1  式  NaN
14   Googleディスプレイネットワーク 12月分 12/1〜12/31   23224  1  式  NaN
15                                                        
16     Yahoo!リスティング 12月分 12/1〜12/31 YSS  113373  1  式  NaN
17       Yahoo!リマーケティング 12月分 12/1〜12/31   28775  1  式  NaN
18   Yahoo!ディスプレイネットワーク 12月分 12/1〜12/31   19010  1  式  NaN
19         Googleリスティング 12月分 12/1〜12/31  158389  1  式  NaN
20       Googleリマーケティング 12月分 12/1〜12/31   45530  1  式  NaN
21   Googleディスプレイネットワーク 12月分 12/1〜12/31   23224  1  式  NaN
22                         プレサンス ロジェ 江坂  
person EdChum    schedule 16.01.2019
comment
спасибо за ответ, но это не то, что задано в вопросе. Я думаю :) - person ; 16.01.2019
comment
Не могли бы вы обновить свой вопрос и опубликовать именно то, что вам нужно, на самом деле кажется, что фактические данные не имеют значения. - person EdChum; 16.01.2019
comment
привет, на самом деле мне нужна ваша помощь еще раз о python и csv :) если у вас есть время, не могли бы вы проверить этот вопрос. stackoverflow.com/questions/54877358/ - person ; 26.02.2019