Python支持数据帧级操作

Python支持数据帧级操作,python,pandas,Python,Pandas,我需要对一个数据表执行大量的行级操作和几页代码 例如,如果row.Col_A='X':row.Col_B='Y' 我认为ItErrors不适合更改表值。 因此,我已将该表转换为点地图字典列表。有了它,我可以循环浏览列表,并为每一个字典行编写如上所述的代码,然后保存更改 是否可以将数据作为数据帧来执行此操作 有很多逻辑,我认为最清晰的是这样写的,所以我不喜欢使用map或apply函数。您可以通过以下方式将apply函数与lambda一起使用: df['Col_B'] = df['Col_A'].a

我需要对一个数据表执行大量的行级操作和几页代码

例如,如果row.Col_A='X':row.Col_B='Y'

我认为ItErrors不适合更改表值。 因此,我已将该表转换为点地图字典列表。有了它,我可以循环浏览列表,并为每一个字典行编写如上所述的代码,然后保存更改

是否可以将数据作为数据帧来执行此操作


有很多逻辑,我认为最清晰的是这样写的,所以我不喜欢使用map或apply函数。

您可以通过以下方式将apply函数与lambda一起使用:

df['Col_B'] = df['Col_A'].apply(lambda a: 'Y' if a == 'X' else 'N')
这将通过查看列A并在列A为“X”时给出值“Y”,否则给出值“N”,从而在数据帧df上创建列Col_B

如果您的函数有点复杂,您可以预先定义它,并在apply函数中调用它,如下所示:

def yes_or_no(x):
    if x == 'X':
        return 'Y'
    else:
        return 'N'
df['Col_B'] = df['Col_A'].apply(lambda a: yes_or_no(a))

按行迭代数据帧并更改列值的一种可能方法是:

确保索引中没有重复的值。如果有,只需使用reset_index获得可接受的索引

迭代索引并使用at访问各个值

或者,如果可以通过列的位置而不是名称访问列,则可以使用更高效的iat:


当您直接访问单个元素时,可以避免ITError为每行创建一个系列的开销,并且可以执行更改。好了,当你不能使用矢量化的Pandas或numpy方法时,这是一种不那么糟糕的方法。

让我们来看看下面的数据帧示例:

import pandas as pd
import numpy as np

some_data = pd.DataFrame({
    'col_a': [1, 2, 1, 2, 3, 4, 3, 4],
    'col_b': ['a', 'b', 'c', 'c', 'a', 'b', 'z', 'z']
})
我们希望基于一个或多个现有列的值创建一个新列

如果您只有两种选择,我建议您使用numpy。其中如下所示:

some_data['np_where_example'] = np.where(some_data.col_a < 3, 'less_than_3', 'greater_than_3')
print(some_data)
>>>
   col_a col_b           col_c map_example np_where_example  \
0      1     a     less_than_3         NaN      less_than_3   
1      2     b     less_than_3         BBB      less_than_3   
2      1     c     less_than_3         NaN      less_than_3   
3      2     c     less_than_3         NaN      less_than_3   
4      3     a  greater_than_3         NaN   greater_than_3   
5      4     b  greater_than_3         BBB   greater_than_3   
6      3     z  greater_than_3         ZZZ   greater_than_3   
7      4     z  greater_than_3         ZZZ   greater_than_3 

# multiple conditions
some_data['np_where_multiple_conditions'] = np.where(((some_data.col_a >= 3) & (some_data.col_b == 'z')),
                                                     'is_true',
                                                     'is_false')
print(some_data)
>>>
   col_a col_b np_where_multiple_conditions
0      1     a                     is_false
1      2     b                     is_false
2      1     c                     is_false
3      2     c                     is_false
4      3     a                     is_false
5      4     b                     is_false
6      3     z                      is_true
7      4     z                      is_true

如您所见,在所有情况下,未指定条件的值都会计算为NaN。

我喜欢在zipdf['a'],df['B']中使用I,j:如果I==1:j==2等。。。您可以使用zip并行循环多个列。DataFrame的底层存储是numpy数组的集合,因此您可以对其进行迭代。出于性能原因,建议不要这样做,因为Python循环比Pandas或numpy方法慢得多,但它并不比在任何其他Python容器上迭代差,只要您直接访问数据帧而不是数据帧上的视图,那么,您是对的,应该避免使用ItErrors。@SergeBallesta我同意,但有些情况下,你无法避免循环,尽管,我认为有时这是不可避免的。我认为创建函数、applylambda x、pandas/numpy矢量化方法和列表理解可以完成95%的工作。这可以扩展到所有列。类似于df.itertuples中的*df.columns:@LincolnHannah作为循环的替代。向量化的np.where是我经常使用的最强大的方法之一。我会调查的,我喜欢np。我觉得它经常被忽视。
import pandas as pd
import numpy as np

some_data = pd.DataFrame({
    'col_a': [1, 2, 1, 2, 3, 4, 3, 4],
    'col_b': ['a', 'b', 'c', 'c', 'a', 'b', 'z', 'z']
})
some_data['np_where_example'] = np.where(some_data.col_a < 3, 'less_than_3', 'greater_than_3')
print(some_data)
>>>
   col_a col_b           col_c map_example np_where_example  \
0      1     a     less_than_3         NaN      less_than_3   
1      2     b     less_than_3         BBB      less_than_3   
2      1     c     less_than_3         NaN      less_than_3   
3      2     c     less_than_3         NaN      less_than_3   
4      3     a  greater_than_3         NaN   greater_than_3   
5      4     b  greater_than_3         BBB   greater_than_3   
6      3     z  greater_than_3         ZZZ   greater_than_3   
7      4     z  greater_than_3         ZZZ   greater_than_3 

# multiple conditions
some_data['np_where_multiple_conditions'] = np.where(((some_data.col_a >= 3) & (some_data.col_b == 'z')),
                                                     'is_true',
                                                     'is_false')
print(some_data)
>>>
   col_a col_b np_where_multiple_conditions
0      1     a                     is_false
1      2     b                     is_false
2      1     c                     is_false
3      2     c                     is_false
4      3     a                     is_false
5      4     b                     is_false
6      3     z                      is_true
7      4     z                      is_true
some_data['map_example'] = some_data.col_b.map({
    'b': 'BBB',
    'z': 'ZZZ'
})
print(some_data)
>>>
   col_a col_b map_example
0      1     a         NaN
1      2     b         BBB
2      1     c         NaN
3      2     c         NaN
4      3     a         NaN
5      4     b         BBB
6      3     z         ZZZ
7      4     z         ZZZ