pandas数据处理常用函数demo之创建/行列操作/查看/文件操作

pandas是Python下强大的数据分析工具,这篇文章代码主要来自于
10 Minutes to pandas,我将示例代码进行了重跑和修改,基本可以满足所有操作,但是使用更高级的功能可以达到事半功倍的效果:原文如下:
http://pandas.pydata.org/pandas-docs/stable/10min.html
初次使用pandas,很多人最头痛的就是Merge, join等表的操作了,下面这个官方手册用图形的形式形象的展示出来了表操作的方式:
http://pandas.pydata.org/pandas-docs/stable/merging.html

创建dataframe

DataFrame和Series作为padans两个主要的数据结构,是数据处理的载体和基础。

def create():

    #create Series
    s = pd.Series([1,3,5,np.nan,6,8])
    print s

    #create dataframe
    dates = pd.date_range('20130101', periods=6)
    df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=list('ABCD'))
    print df

#Creating a DataFrame by passing a dict of objects that can be converted to series-like.
    df2 = pd.DataFrame({ 'A' : 1.,
                        'B' : pd.Timestamp('20130102'),
                        'C' : pd.Series(1,index=list(range(4)),dtype='float32'),
                        'D' : np.array([3] * 4,dtype='int32'),
                        'E' : pd.Categorical(["test","train","test","train"]),
                        'F' : 'foo' })
    print df2
    #Having specific dtypes
    print df2.dtypes

查看dataframe属性

我们生成数据或者从文件加在数据后,首先要看数据是否符合我们的需求,比如行和列数目,每列的基本统计信息等,这些信息可以让我们认识数据的特点或者检查数据的正确性:

def see():

    dates = pd.date_range('20130101', periods=6)
    df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=list('ABCD'))
    print df

    #See the top & bottom rows of the frame'''
    print df.head(2)
    print df.tail(1)

    #Display the index, columns, and the underlying numpy data,num of line and col
    print df.index
    print df.columns
    print df.values
    print df.shape[0]
    print df.shape[1]

    #Describe shows a quick statistic summary of your data
    print df.describe()

    #Transposing your data
    print df.T

    #Sorting by an axis,0 is y,1 is x,ascending True is zhengxv,false is daoxv
    print df.sort_index(axis=0, ascending=False)

    #Sorting by values
    print df.sort(column='B')

    #see valuenums
    print df[0].value_counts()
    print df[u'hah'].value_counts()

    #see type and change
    df.dtypes
    df[['two', 'three']] = df[['two', 'three']].astype(float)

选取数据

了解了数据基本信息后,我们可能要对数据进行一些裁剪。很多情况下,我们并不需要数据的全部信息,因此我们要学会选取出我们感兴趣的数据和行列,接下来的例子就是对数据的裁剪:

def selection():

    dates = pd.date_range('20130101', periods=6)
    df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=list('ABCD'))
    print df

    #Selecting a single column, which yields a Series, equivalent to df.A
    print df['A']
    print df.A

    #Selecting via [], which slices the rows.
    print df[0:3]
    print df['20130102':'20130104']

    #Selection by Label

    #For getting a cross section using a label
    print df.loc[dates[0]]

    #Selecting on a multi-axis by label
    print df.loc[:,['A','B']]

    #Showing label slicing, both endpoints are included
    print df.loc['20130102':'20130104',['A','B']]

    #For getting a scalar value
    print df.loc[dates[0],'A']
    print df.at[dates[0],'A']


    #Selection by Position

    #Select via the position of the passed integers
    print df.iloc[3]

    #By integer slices, acting similar to numpy/python
    print df.iloc[3:5,0:2]

    #By lists of integer position locations, similar to the numpy/python style
    print df.iloc[[1,2,4],[0,2]]

    #For slicing rows explicitly
    print df.iloc[1:3,:]

    #For getting a value explicitly
    print df.iloc[1,1]
    print df.iat[1,1]


    #Boolean Indexing

    #Using a single column's values to select data.
    print df[df.A > 0]

    #Using the isin() method for filtering:
    df2 = df.copy()
    df2['E'] = ['one', 'one','two','three','four','three']
    print df2[df2['E'].isin(['two','four'])]

    #A where operation for getting.
    print df[df > 0]
    df2[df2 > 0] = -df2

    #Setting
    #Setting a new column automatically aligns the data by the indexes
    s1 = pd.Series([1,2,3,4,5,6], index=pd.date_range('20130102', periods=6))
    df['F'] = s1
    print df

    #Setting values by label/index
    df.at[dates[0],'A'] = 0
    df.iat[0,1] = 0
    print df

    #Setting by assigning with a numpy array
    df.loc[:,'D'] = np.array([5] * len(df))
    print df

文件操作

很多时候,我们的数据并不是自己生成的,而是从文件中读取的,数据文件则具有各种各样的来源,下面就展示如何加载和保存数据。pandas提供了多种API,可以加载txt/csv/libsvm等各个格式的数据,完全可以满足数据分析的需求

def file():
    ts = pd.Series(np.random.randn(1000), index=pd.date_range('1/1/2000', periods=1000))
    df = pd.DataFrame(np.random.randn(1000, 4), index=ts.index,
                      columns=['A', 'B', 'C', 'D'])
    pd.read_csv('foo.csv')
    df.to_csv('foo.csv')
<think>好的,我现在需要帮助用户解决如何补全他们的Python代码,使用pandas将给定的原始数据转换成特定格式的DataFrame。用户之前提供的代码片段中存在一些问题,我需要仔细分析并找到正确的解决方案。 首先,回顾用户的问题和之前的对话。用户最初想要生成一个包含Florida和Washington州的数据的DataFrame,输出特定的格式。之前的回答中,我提供了一个解决方案,通过创建字典并转置DataFrame来实现。现在用户的新问题涉及到补全代码,其中引用了几个站内的参考资料,可能需要调整现有代码。 用户当前的代码是: import pandas as pd def demo(raw_data, origin): df = pd.DataFrame(raw_data, index=origin) # 转换成编程要求所示DataFrame, 并输出 #********** Begin **********# print(df.loc[['Florida','Washington'],'deaths':].T) #********** End **********# return 根据用户提供的引用内容,特别是引用[1]中的原始数据格式,看起来原始数据可能是一个字典或类似结构,其中包含键如'deaths',对应的值是各州的数据。而origin参数可能是州的列表,比如['Florida', 'Washington']。 但用户提供的代码中,创建DataFrame的方式是使用pd.DataFrame(raw_data, index=origin),这假设raw_data是一个字典,其中每个键对应的值是一个列表,长度与origin的长度一致。例如,如果raw_data是{'deaths': [616, 62], ...},而origin是['Florida', 'Washington'],那么这样创建的DataFrame的行索引是origin,列是各个键。但根据用户想要的输出,需要行是属性(如deaths, battles等),列是州名,所以需要转置DataFrame。 然而,用户提供的代码中的print语句试图使用df.loc来选取行和列,这可能不正确,因为原DataFrame的行是州,列是属性。例如,如果df是这样的结构,那么要得到属性作为行,州作为列,应该转置DataFrame。所以正确的做法可能是先创建DataFrame,然后转置,并筛选所需的行和列。 但用户提供的代码中的print语句使用了df.loc[['Florida','Washington'], 'deaths':].T,这似乎是在选取特定的行和列,然后转置。这可能是因为原DataFrame的行是州,列是属性,因此转置后行变成属性,列变成州。不过,如果origin已经是['Florida', 'Washington'],那么index=origin会让这两个州成为行索引,而列是各个属性。所以直接转置df.T应该就能得到所需的格式,然后可能需要筛选特定的属性,比如从'deaths'到最后的列。 不过,用户提供的引用[1]中的原始数据似乎包含多个属性,如deaths, deserters, readiness等,每个属性对应的两个数值对应两个州。因此,正确的步骤应该是: 1. 将raw_data转换为一个字典,其中键是属性名,值是对应的两个州的数值列表。 2. 使用pd.DataFrame创建DataFrame,指定index为origin(即州名),这样每行对应一个州,每列对应一个属性。 3. 转置DataFrame,使得行变为属性,列变为州名。 4. 根据需求,可能需要筛选特定的属性或调整列顺序。 用户提供的代码中,print语句试图使用loc来选择行和列,但原来的df的行是州,列是属性。所以df.loc[['Florida', 'Washington'], 'deaths':]会选择这两个州的行,以及从'deaths'开始的所有列,然后转置。这样转置后的结果行是属性,列是州,符合用户想要的输出。 但问题在于,在创建DataFrame时,是否已经正确地将raw_data构造为列是属性,行是州的结构。例如,如果raw_data的结构是每个键对应的列表是各州的数值,那么pd.DataFrame(raw_data, index=origin)是正确的,因为每个键(列)的值列表的长度应该等于origin的长度(即州的数量)。 例如,假设raw_data的结构如下: raw_data = { 'deaths': [616, 62], 'battles': [2, 3], 'size': [1400, 849], 'veterans': [26, 48], 'readiness': [3, 3], 'armored': [1, 1], 'deserters': [2, 31] } 而origin = ['Florida', 'Washington'] 那么pd.DataFrame(raw_data, index=origin)将创建一个DataFrame,行索引是州名,列是各个属性,每个单元格是对应的数值。此时,转置这个DataFrame(df.T)将使得行变为属性,列变为州名,这正是用户所需的格式。 但用户提供的代码中,print语句中的df.loc[['Florida','Washington'], 'deaths':].T可能存在错误,因为行索引已经是Florida和Washington,所以loc选择行可能不需要再指定这两个州,除非存在其他行需要过滤。此外,'deaths': 作为列的选择可能是指从deaths列开始到最后一列,但可能所有列都需要包含。因此,正确的做法可能是直接转置整个DataFrame,或者如果存在不需要的列,则需要筛选。 但根据用户想要的输出,所有的属性都应包括,因此正确的代码应该是: df = pd.DataFrame(raw_data, index=origin).T 然后返回这个df。 但用户提供的代码中,在Begin和End之间的代码是: print(df.loc[['Florida','Washington'],'deaths':].T) 这可能存在问题,因为如果df的行索引是origin(即Florida和Washington),那么使用loc选择行Florida和Washington是多余的,因为index=origin已经确保了行是这两个州。此外,列选择从deaths开始,可能假设属性是按顺序排列,但可能更可靠的方法是直接转置整个DataFrame,而不进行筛选。 因此,用户的问题可能在于如何正确补全demo函数中的代码,以生成所需的DataFrame。根据之前的解决方案,正确的步骤应该是: 1. 创建DataFrame,行是州,列是属性。 2. 转置DataFrame,行变为属性,列变为州。 3. 输出或返回转置后的DataFrame。 但用户提供的代码中的print语句可能存在问题,因为它试图使用loc来选择行和列,然后转置。正确的做法可能应该是直接转置整个DataFrame,而不需要loc选择,因为所有行和列都需要。 因此,补全后的代码应该是: 在demo函数中: def demo(raw_data, origin): df = pd.DataFrame(raw_data, index=origin) df = df.T # 转置DataFrame print(df) return df 这样生成的df的行是属性,列是州,符合用户想要的输出。 但根据用户提供的代码中的Begin和End部分,他们可能希望在该区域补全代码,可能要求使用print语句输出特定的格式,并返回df。所以正确的补全可能是: 在Begin和End之间: df = pd.DataFrame(raw_data, index=origin).T print(df) 或者,如果必须使用loc,可能需要调整,但可能没有必要,因为转置后已经正确。 但用户提供的原始代码中的print语句是: print(df.loc[['Florida','Washington'],'deaths':].T) 这可能是因为在创建df时,行索引不是州,而是其他内容,导致需要选择特定的行。但根据之前的分析,如果正确使用index=origin,行已经是州,所以转置后,行是属性,列是州,因此正确的代码应该是: df = pd.DataFrame(raw_data, index=origin).T print(df) 这样不需要使用loc来选择行,因为转置后的df已经正确。 但用户提供的引用中,引用[1]的原始数据可能结构不同,可能需要处理。例如,引用[1]中的原始数据可能是一个列表,而不是字典,如: raw_data = [ ('deaths', [616, 62]), ('deserters', [2, 31]), ('readiness', [3, 3]), ('regiment', ['Nighthawks', 'Dragoons']), ('size', [1400, 849]), ('veterans', [26, 48]) ] 在这种情况下,需要将raw_data转换为字典,然后创建DataFrame。例如: raw_data_dict = {k: v for k, v in raw_data} df = pd.DataFrame(raw_data_dict, index=origin).T 但用户提供的函数参数是raw_data和origin,可能假设raw_data已经是一个字典,或者需要处理成字典。因此,在demo函数中,可能需要先将raw_data转换为字典,如果它是以列表形式提供的。 例如,如果raw_data是像引用[1]中的列表: raw_data = [ ('deaths', [616, 62]), ('deserters', [2, 31]), ('readiness', [3, 3]), ('regiment', ['Nighthawks', 'Dragoons']), ('size', [1400, 849]), ('veterans', [26, 48]) ] 那么需要将其转换为字典,再创建DataFrame。因此,正确的代码应该是: def demo(raw_data, origin): # 将raw_data转换为字典 data_dict = {k: v for k, v in raw_data} # 创建DataFrame,行索引为州,列是属性 df = pd.DataFrame(data_dict, index=origin) # 转置,使行是属性,列是州 df = df.T print(df) return df 但用户提供的代码框架中,函数参数是raw_data和origin,并且已经创建了df = pd.DataFrame(raw_data, index=origin),所以可能假设raw_data已经是字典形式,或者可以传递给pd.DataFrame的适当结构。 综上,用户的原始代码可能需要补全的部分是: 在Begin和End之间,正确的代码应该是将df转置,并打印转置后的结果。因此: #********** Begin **********# df = df.T # 转置DataFrame print(df) #********** End **********# 这样,原来的df是州作为行,属性作为列,转置后属性作为行,州作为列,符合用户所需的输出。 但用户提供的代码中的print语句尝试使用loc来选取行和列,可能因为原来的df没有正确构建。例如,如果raw_data的结构不正确,导致df的列不是属性,而是其他内容,可能需要调整。但根据用户提供的引用[1]中的数据,正确的raw_data应该是一个字典或可以转换为字典的结构,其中每个键是属性名,对应的值是两个州的数值列表。 因此,补全后的代码应确保正确创建DataFrame并转置,然后打印。因此,正确的补全代码是在Begin和End之间添加: df = df.T print(df) 这将转置原始的DataFrame,使得行是属性,列是州,然后打印结果。 最终,用户所需的输出是: Florida Washington deaths 616 62 battles 2 3 size 1400 849 veterans 26 48 readiness 3 3 armored 1 1 deserters 2 31 因此,确保所有属性都被包含,并且顺序正确。如果raw_data中的顺序不同,可能需要调整,但根据示例,用户可能不需要特定的顺序,只要所有属性都存在。 因此,总结补全步骤: 1. 使用pd.DataFrame(raw_data, index=origin)创建原始DataFrame,行是州,列是属性。 2. 转置DataFrame,得到行是属性,列是州。 3. 打印转置后的DataFrame。 因此,补全后的代码为: def demo(raw_data, origin): df = pd.DataFrame(raw_data, index=origin) # 行是州,列是属性 # 转换成编程要求所示DataFrame, 并输出 #********** Begin **********# df = df.T # 转置,行变属性,列变州 print(df) #********** End **********# return df 这样应该能得到正确的输出。 此外,需要确保raw_data的结构正确。例如,如果raw_data是一个列表的元组,如引用[1]所示,可能需要先将其转换为字典。但根据用户提供的代码框架,参数是raw_data和origin,可能假设raw_data已经是正确的字典格式。如果raw_data是列表的元组,则需要在函数内部转换为字典,如: data_dict = {k: v for k, v in raw_data} df = pd.DataFrame(data_dict, index=origin) 但用户提供的原始代码中直接使用pd.DataFrame(raw_data, index=origin),这可能意味着raw_data已经是适合创建DataFrame的结构,如字典。如果用户传入的raw_data是列表的元组,则需要先转换为字典。因此,可能需要修改代码,例如: def demo(raw_data, origin): # 将raw_data转换为字典 data_dict = {k: v for k, v in raw_data} df = pd.DataFrame(data_dict, index=origin) df = df.T print(df) return df 但用户提供的代码框架中,原始代码已经创建了df = pd.DataFrame(raw_data, index=origin),所以可能假设raw_data可以直接被转换为DataFrame,可能要求用户传入的是字典,或者列表的元组,其中每个元组的第二个元素是数值列表。例如,如果raw_data是字典,则没问题;如果是列表的元组,则pd.DataFrame会将其解释为列名和数据,但可能需要调整。 例如,如果raw_data是列表的元组,如: raw_data = [ ('deaths', [616, 62]), ('battles', [2, 3]), ... ] 那么pd.DataFrame(raw_data, index=origin)会报错,因为pd.DataFrame期望字典或类似结构。因此,需要先将列表的元组转换为字典。因此,正确的处理方式是在函数内部转换: def demo(raw_data, origin): data_dict = {k: v for k, v in raw_data} df = pd.DataFrame(data_dict, index=origin) df = df.T print(df) return df 因此,用户提供的原始代码可能需要调整,将raw_data转换为字典,然后创建DataFrame。但根据用户提供的代码框架,参数是raw_data和origin,并且现有的代码是df = pd.DataFrame(raw_data, index=origin),所以可能用户传入的raw_data已经是字典形式。如果用户传入的是列表的元组,则需要修改代码,添加转换为字典的步骤。 综上所述,用户可能需要补全的代码是在Begin和End之间转置DataFrame并打印。因此,正确的补全代码是: #********** Begin **********# df = df.T print(df) #********** End **********# 这样,原来的df被转置,得到正确的格式,然后打印并返回。</think>### 分步解决方案 根据需求,需将原始数据转换为 **属性为行索引、州名为列索引** 的DataFrame。以下是实现步骤: --- #### 一、正确代码实现 ```python import pandas as pd def demo(raw_data, origin): # 创建初始DataFrame(州为行,属性为列) df = pd.DataFrame(raw_data, index=origin) # 转置行列,使属性成为行索引 formatted_df = df.T # 输出目标格式 print(formatted_df) return formatted_df ``` --- #### 二、代码逻辑解析 1. **数据结构解析** - `raw_data` 应为字典格式,键为属性名,值为对应各州数据的列表 示例格式: ```python raw_data = { 'deaths': [616, 62], 'battles': [2, 3], 'size': [1400, 849], # 其他属性... } ``` - `origin` 是州名列表,如 `['Florida', 'Washington']` 2. **DataFrame构建** - `pd.DataFrame(raw_data, index=origin)` 创建初始表格: ``` deaths battles size ... Florida 616 2 1400 Washington 62 3 849 ``` - 通过 `.T` 转置后得到目标格式: ``` Florida Washington deaths 616 62 battles 2 3 size 1400 849 ... ... ... ``` --- #### 三、错误处理与验证 1. **输入数据验证** - 确保每个属性值列表长度与 `origin` 长度一致 - 示例验证代码: ```python # 测试数据 raw_data = { 'deaths': [616, 62], 'battles': [2, 3], 'size': [1400, 849], 'veterans': [26, 48], 'readiness': [3, 3], 'armored': [1, 1], 'deserters': [2, 31] } origin = ['Florida', 'Washington'] # 执行函数 result = demo(raw_data, origin) ``` 2. **输出验证** ```python print(result.to_string()) # 应输出: """ Florida Washington deaths 616 62 battles 2 3 size 1400 849 veterans 26 48 readiness 3 3 armored 1 1 deserters 2 31 """ ``` --- #### 四、扩展应用场景 1. **动态列顺序控制** 如需指定列顺序: ```python formatted_df = formatted_df[origin] # 显式指定列顺序 ``` 2. **缺失值处理** 使用 `fillna` 处理不完整数据: ```python raw_data = { 'deaths': [616, 62], 'armored': [None, 1] # Washington装甲数据缺失 } formatted_df.fillna(0, inplace=True) # 缺失值填充为0 ``` --- ### 最终代码流程图 ```mermaid graph TD A[原始字典数据] --> B{创建初始DataFrame} B --> C[行=州, 列=属性] C --> D{转置操作} D --> E[行=属性, 列=州] E --> F[输出目标格式] ``` 通过上述实现,可正确将键值对数据转换为要求的二维表格结构[^1][^2][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值