Pandas:将特定函数应用于列并创建其他列

时间:2017-02-02 16:25:06

标签: python loops pandas dataframe

我有一个像这样的地理坐标的pandas数据框df

    lat         lon         
0   48.01025772 -6.15690851 
1   48.02164841 -6.10588741 
2   48.03302765 -6.05480051 
... ...         ...

我需要将这些坐标转换为不同的系统,并为此设置专用功能。我计划创建两个新列,df['N']lat配对,df['E']lon配对。

这与函数的外观无关,所以为简单起见,我们称之为 f 。该函数的运行方式如下:E, N = f(float(lat), float(lon))

有没有办法可以遍历df的所有行,提取lat,lon对,(计算转换)并将值分配给相关列?

5 个答案:

答案 0 :(得分:2)

您可以在df上使用apply并传递axis=1,在您的函数中,您应该返回Series并直接分配2列:

In [207]:
def foo(lat, lon):
    return pd.Series([lat + 10, lon * 100])
​
df[['new_lat','new_lon']] = df.apply(lambda x: foo(x['lat'], x['lon']), axis=1)
df

Out[207]:
         lat       lon    new_lat   new_lon
0  48.010258 -6.156909  58.010258 -615.6909
1  48.021648 -6.105887  58.021648 -610.5887
2  48.033028 -6.054801  58.033028 -605.4801

取决于您使用apply执行的功能可以而且应该避免

答案 1 :(得分:1)

使用熊猫很容易。你想要apply

答案 2 :(得分:1)

您可以使用:

df[['lat', 'lon']].apply(lambda row: f(float(row['lat']), float(row['lon']), axis=1)

答案 3 :(得分:1)

您可以避免创建pd.Series,因为它会花费很多时间,而应通过传递result_type='expand'参数。在大型数据框上运行速度明显加快

def foo(lat, lon):
    return [lat + 10, lon * 100]

df[['new_lat','new_lon']] = df.apply(lambda x: foo(x['lat'], x['lon']), axis=1, result_type='expand')

在我的数据帧上,实现了以下计时:纯应用(不分配,返回列表)-27秒,result_type='expand'-30秒,pd.Series(...)返回-41秒。< / p>

答案 4 :(得分:1)

如果您不总是知道返回的列的数目,名称或顺序,则此解决方案更加灵活:

|------------+-------+------------+--------+--------+------------|
| Date       | Items | Unit Price | Amount | Amount | Categories |
|------------+-------+------------+--------+--------+------------|
| 2019/09/17 | A     |       2.64 |      1 |   2.64 | materials  |
|            | B     |      52.67 |      2 | 105.34 | diagnosis  |
|            | C     |       3.08 |      1 |   3.08 | materials  |
|            | D     |       3.85 |      2 |    7.7 | materials  |
|            | E     |      33.66 |      2 |  67.32 | materials  |
|            | F     |         40 |      1 |     40 | treatments |
|            | G     |       16.5 |      1 |   16.5 | materials  |
|            | H     |          4 |      3 |     12 | treatments |
|            | I     |         40 |      1 |     40 | bed        |
|            | M     |       6    |     13 |     78 | treatments |
|------------+-------+------------+--------+--------+------------|
#+TBLFM: $5=$3*$4