Разделить данные из excel на основе значения данных с помощью pandas

У меня есть фрейм данных в формате ниже

version,1.3.0
info,team,Australia
info,team,India
info,gender,male
ball,1,0.5,India,V Sehwag,IK Pathan,B Lee,0,0,"",""
ball,1,0.6,India,V Sehwag,IK Pathan,B Lee,0,0,"",""

Я хочу разделить данные на два с помощью панд

Первый фрейм данных

info,team,Australia
info,team,India
info,gender,male

Второй фрейм данных

ball,1,0.5,India,V Sehwag,IK Pathan,B Lee,0,0,"",""
ball,1,0.6,India,V Sehwag,IK Pathan,B Lee,0,0,"",""

Это не похоже на фрейм данных

piRSquared 10.09.2018 07:46

(df ​​= pd.read_csv ('merge_data / 291353.csv', sep = 'delimit', header = None)

Amar Shah 10.09.2018 07:53

@AmarShah - Значит, это не файл Excel? Разделитель не запятая? Может понадобится df = pd.read_csv('merge_data/291353.csv', header=None, skiprows=1)

jezrael 10.09.2018 07:55

Skiprows удалил строку версии, но я хочу, чтобы строки, содержащие 'info', были в одном фрейме данных и втором фрейме данных, содержащем 'шары'

Amar Shah 10.09.2018 07:58

@AmarShah - Значит, первая строка не version,1.3.0?

jezrael 10.09.2018 08:00

Да ... первая строка - версия 1.3.0

Amar Shah 10.09.2018 08:03
2
6
54
3

Ответы 3

Я считаю, что нужно:

df = pd.read_excel(file, header=None, skiprows=1)

df1 = df[df[0] == 'info']
df2 = df[df[0] == 'ball']

Или, в более общем случае, создать dictionary of DataFrame:

dfs = dict(tuple(df.groupby(0)))

print (dfs['info'])
print (dfs['ball'])

Обновлено: если есть несколько файлов и лучше использовать модуль csv с добавлением каждой строки в список по первому значению, а затем создать DataFrame с помощью конструктора:

import csv, glob

info, ball = [],[]
for f in glob.glob('csv/*.csv'):
    with open(f, "r") as f1:
        reader = csv.reader(f1)
        for L in reader:
            if L[0] == 'info':
                info.append(L)
            if L[0] == 'ball':
                ball.append(L)

#print (info)
#print (ball)           

df1 = pd.DataFrame(info)
print (df1)

df2 = pd.DataFrame(ball)
print (df2)

Если вы хотите создать для каждого файла 2 DataFrames:

for f in glob.glob('csv/*.csv'):
    with open(f, "r") as f1:
        info, ball = [],[]
        reader = csv.reader(f1)
        for L in reader:
            if L[0] == 'info':
                info.append(L)
            if L[0] == 'ball':
                ball.append(L)

        df1 = pd.DataFrame(info)
        print (df1)

        df2 = pd.DataFrame(ball)
        print (df2)

Другое решение:

for f in glob.glob('csv/*.csv'):
    df = pd.read_csv(f, sep='delimit',
                     skipinitialspace = True,
                     skiprows=1,
                     quotechar = '"',
                     names=['data'])
    df1 = df.loc[df['data'].str.startswith('info'), 'data'].str.split(',',expand=True)
    df2 = df.loc[df['data'].str.startswith('ball'), 'data'].str.split(',',expand=True)
    print (df1)
    print (df2)           

@AmarShah - Есть какая-то ошибка? Вы можете объяснить больше?

jezrael 10.09.2018 07:56

df = pd.read_excel (file, header = None, skiprows = 1) df1 = df [df [0] == 'info'] Это возвращает все строки даже с данными, имеющими 'шары'

Amar Shah 10.09.2018 08:00

@AmarShah - Что такое print (df[0].tolist())?

jezrael 10.09.2018 08:01

@AmarShah - Достоверны ли данные?

jezrael 10.09.2018 08:15

Нет ... вы хотите, чтобы я поделился файлом CSV?

Amar Shah 10.09.2018 08:18

@AmarShah - Да, вы можете поделиться своими данными в gdocs, dropbox или отправить их на мою электронную почту из моего профиля.

jezrael 10.09.2018 08:21

Отправлено вам по электронной почте

Amar Shah 10.09.2018 08:26

@AmarShah - Есть несколько файлов CSV с похожим форматом?

jezrael 10.09.2018 08:41

@AmarShah - И на выходе будет 2 больших файла csv, один для info и один для file с файлами joindex 200 \?

jezrael 10.09.2018 08:43

@AmarShah - Хорошо, можно мне еще файлы?

jezrael 10.09.2018 08:49

Отправить вам еще файлы.

Amar Shah 10.09.2018 08:57

Я нашел один способ разделить данные matchData = df [df [0] .str.match ('info')] runData = df [df [0] .str.match ('ball')]

Amar Shah 10.09.2018 09:49

Использование itertoolsgroupby

from itertools import groupby

text = """version,1.3.0
info,team,Australia
info,team,India
info,gender,male
ball,1,0.5,India,V Sehwag,IK Pathan,B Lee,0,0,"",""
ball,1,0.6,India,V Sehwag,IK Pathan,B Lee,0,0,"",""
"""

g = groupby(text.splitlines()[1:], key=lambda x: x.split(',')[0])

df1, df2 = (
    pd.read_csv(pd.io.common.StringIO('\n'.join(t[1])), header=None)
    for t in g
)

print(df1, df2, sep='\n\n')

      0       1          2
0  info    team  Australia
1  info    team      India
2  info  gender       male

     0   1    2      3         4          5      6   7   8   9   10
0  ball   1  0.5  India  V Sehwag  IK Pathan  B Lee   0   0 NaN NaN
1  ball   1  0.6  India  V Sehwag  IK Pathan  B Lee   0   0 NaN NaN

Это файл Excel.

jezrael 10.09.2018 07:53

Как я могу добиться этого с помощью файлов CSV, которые я читаю и которые поступают в виде фрейма данных?

Amar Shah 10.09.2018 08:16

Наконец-то я нашел способ разделить данные. Код приведен ниже. Я читаю 200 файлов CSV и конвертирую в 2 фрейма данных, один с информацией, а другой с мячом.

import pandas as pd
import os
files = os.listdir("merge_data")

finalRunsData = pd.DataFrame()

for file in files:
    #Dataframe declaration
    df = pd.DataFrame()
    matchData = pd.DataFrame()
    runsData = pd.DataFrame()
    #Read excel data
    df = pd.read_csv('merge_data/'+file,sep='delimit',header=None,skipinitialspace = True,skiprows=1,quotechar = '"')
    #Split runs data
    matchData = df[df[0].str.match('info')]
    runsData = df[df[0].str.match('ball')]
    #For runs
    finalRunsData = finalRunsData.append(runsData[0].str.split(',',expand=True))

Я стараюсь немного улучшить ваше решение в своем ответе;)

jezrael 11.09.2018 08:04

Извините за задержку. Если мой ответ был полезен, не забудьте его принимать - щелкните галочку рядом с ответом, чтобы переключить его с серого на заполненный. Спасибо.

jezrael 11.09.2018 08:36

Другие вопросы по теме