2014-02-28 111 views
3

我经常处理的数据,该数据格式不适用于多列(即数字字段不一致等)如何将功能的熊猫数据帧在同一时间

可能有其他的方式,这我不是但是我在数据框中格式化单个列的方式是使用函数并将列映射到该函数。

format = df.column_name.map(format_number) 

问题:1 - 如果我有50列的数据帧,并且要应用的格式,以多列,等列1,3,5,7,9,

你可以走了:

format = df.1,3,5,9.map(format_number) 

..这样我可以在一行中格式化我所有的数字列吗?

回答

7

你可以做df[['Col1', 'Col2', 'Col3']].applymap(format_number)。请注意,虽然这将返回新的列;它不会修改现有的DataFrame。如果您想将值重新输入原始值,则必须执行df[['Col1', 'Col2', 'Col3']] = df[['Col1', 'Col2', 'Col3']].applymap(format_number)

+0

您能否通过数字来引用列,而不是名字以及这样做时? 是否还有任何方式编程创建该字符串(这将改变取决于你有多少列)并应用format_number函数?即如果我确切地知道每次在工作表中有多少列,但是如果我不知道列的数量,并且想要将相同的函数应用于每一列,那么上面的工作将会正常工作,是否有更好的方法来做到这一点? – yoshiserry

+0

@yoshiserry:如果你只是想将它应用到所有的列,只需做'df.applymap(format_number)'。 – BrenBarn

0

您可以使用apply这样的:

df.apply(lambda row: format_number(row), axis=1) 

你需要指定的列,虽然在format_number功能:

def format_number(row): 
    row['Col1'] = doSomething(row['Col1'] 
    row['Col2'] = doSomething(row['Col2']) 
    row['Col3'] = doSomething(row['Col3']) 

这并不像@ BrenBarn的答案,优雅,但它有数据帧被修改的优点,因此您不需要再次将列分配回

+0

你能解释一下它是在什么地方修改的吗?我不确定它与上述解决方案有什么不同,因为我没有掌握lamda的功能。 – yoshiserry

+0

@yoshiserry忽略我的代码示例,如果您对数据框执行apply操作,那么数据框本身会被您的函数中的任何更改所修改,因此您不需要将其分配给该列,您可能仍然需要根据您的功能是在做。关键是你只需要调用'df.apply'而不需要说''df [['col1','col2','col3']] = df.apply(lambda row:format_number(row), axis = 1))',在我的代码中,赋值是通过'format_number'函数完成的,所以我猜这个赋值是隐含的,而不是像BrenBarn的回答 – EdChum

+0

那样明确,那么Lamda的功能到底是什么?我还没有掌握lamda的做法? – yoshiserry