使用pandas包

时间:2017-02-14 19:23:58

标签: python python-3.x pandas numpy

我已经使用pd.read_excel

将pls中的xls文件读入Python

我正在尝试清理我的数据,但我已经离开了我的联盟。

每条记录之间都有一个空行。在示例pic中,它优于第4,9和11行。

有一个注释列,在示例中指定(参见链接)为" col_F"。每条记录至少有一个包含文本的单元格。创建此xls文件的人将更长的注释拆分为多个单元格。

我想将col_F中所有特定记录的数据连接到一个单元格中。

一旦我弄清楚如何正确连接col_F,我也会删除空白记录。

我使用的是Python版本3.5.0,numpy 1.12.0和pandas 0.19.2

这是我到目前为止所做的:

import numpy as np
import pandas as pd

data = pd.read_excel("C:/blah/blahblah/file.xls", header=0, nrows=10000)
df = pd.DataFrame(data)

我感谢任何建议或见解!!

谢谢!

原始数据的外观如何: enter image description here

更新: 这是我加载到Python时数据的外观 raw data read into python

这就是我期望的结果: what I would like dataframe to look like when finished

2 个答案:

答案 0 :(得分:2)

想出来!!! 非常感谢诺福克数据科学俱乐部的帮助。

导入pandas,sqlite和os包

import pandas as pd
import sqlite3
import os

指定文件路径和文件名

filepath = "C:/blah/blahblah/randomfolder"
filename = "raw_data.xlsx"
filePathFileName = filepath + "/" + filename
outputPathFileName = filepath + "/cleaned_" + filename
outputFileName = "cleaned_" + filename

使用pandas读取excel文件。

df = pd.read_excel(filePathFileName, header=0, nrows=14)

删除空白行

df.dropna(how='all', inplace=True)

填写数据中的空白

df.ffill(inplace=True)

创建一个sqlite数据库和一个与sqlite数据库的连接

con = sqlite3.connect(":memory:")
con.isolation_level = None
cur = con.cursor()

在sqlite中为我们的数据创建一个表

df.to_sql('example_data', con)

汇总数据的SQL查询

df_pdsql = pd.read_sql_query("SELECT col_A, col_B, col_C, col_D, col_E, GROUP_CONCAT(col_F, ' ') AS col_F FROM example_data GROUP BY col_A", con)

将我们的df写入xlsx文件

df_pdsql.to_excel(outputPathFileName, sheet_name='test', index=False)

让用户知道文件的位置

print("Your new file is located in: " + outputPathFileName)

关闭与sqlite数据库的连接

con.close()

答案 1 :(得分:1)

这是我在@Boud在评论中解释的原始解决方案。我首先在这里创建示例数据:

df = pd.DataFrame([
    ['record1', '10', 'date1', 'optional', 'comment'], 
    ['', '', '', '', 'comment continued'], 
    ['', '', '', '', ''], 
    ['record2', '100', 'date2', '', 'comment'], 
    ['', '', '', '', 'comment continued'], 
    ['', '', '', '', 'comment continued'], 
    ['', '', '', '', 'comment continued'], 
    ['', '', '', '', ''],
    ['record3', '10000', 'date3', '', 'comment']], 
    columns=['col_A', 'col_B', 'col_C', 'col_D', 'col_F'])
df.replace('', np.nan, regex=True, inplace=True)

请注意,此处的空白应填充NaN而不是空格。基本上,首先,您可以使用dropna删除不使用的行。

df.dropna(axis=0, how='all', inplace=True) # drop NaN by row

然后您可以通过以前的记录填写col_A

new_col = []
row_name = ''
for r in df.col_A:
    if not pd.isnull(r):
        row_name = r
    new_col.append(row_name)
df.col_A = new_col

之后,您可以通过将groupby函数应用于A列来对其他列进行分组,并通过加入字符串来聚合其他列,如下所示。

gr = df.groupby('col_A')

def join_str(x):
    x = list(map(str, x))
    x = [e for e in x if str(e) != 'nan']
    return ' '.join(x)

gr.agg({'col_B' : join_str, 
        'col_C': join_str, 
        'col_D': join_str, 
        'col_F': join_str}).reset_index()
相关问题