小编Wal*_*eed的帖子

Pandas - 在块中切割​​大型数据帧

我有一个大的数据帧(> 3MM行),我试图通过一个函数(下面的一个很大程度上简化),我不断收到一条Memory Error消息.

我想我将太大的数据帧传递给函数,所以我试图:

1)将数据帧切成较小的块(最好是切片AcctName)

2)将数据帧传递给函数

3)将数据帧连接回一个大型数据帧

def trans_times_2(df):
    df['Double_Transaction'] = df['Transaction'] * 2

large_df 
AcctName   Timestamp    Transaction
ABC        12/1         12.12
ABC        12/2         20.89
ABC        12/3         51.93    
DEF        12/2         13.12
DEF        12/8          9.93
DEF        12/9         92.09
GHI        12/1         14.33
GHI        12/6         21.99
GHI        12/12        98.81
Run Code Online (Sandbox Code Playgroud)

我知道我的功能正常,因为它可以在较小的数据帧(例如40,000行)上工作.我尝试了以下方法,但是我将小数据帧连接回一个大型数据帧是不成功的.

def split_df(df):
    new_df = []
    AcctNames = df.AcctName.unique()
    DataFrameDict = {elem: pd.DataFrame for elem in AcctNames}
    key_list = [k for k in DataFrameDict.keys()]
    new_df = []
    for key in …
Run Code Online (Sandbox Code Playgroud)

python slice dataframe pandas

14
推荐指数
3
解决办法
1万
查看次数

熊猫-基于条件的重复行

如果该行符合条件,我将尝试创建一个重复行。在下表中,我根据groupby创建了一个累积计数,然后对groupby的MAX进行了另一次计算。

df['PathID'] = df.groupby(DateCompleted).cumcount() + 1
df['MaxPathID'] = df.groupby(DateCompleted)['PathID'].transform(max)

Date Completed    PathID    MaxPathID
1/31/17           1         3
1/31/17           2         3
1/31/17           3         3
2/1/17            1         1
2/2/17            1         2
2/2/17            2         2
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我只想复制2/1/17的记录,因为该日期只有一个实例(即MaxPathID == 1)。

所需输出:

Date Completed    PathID    MaxPathID
1/31/17           1         3
1/31/17           2         3
1/31/17           3         3
2/1/17            1         1
2/1/17            1         1
2/2/17            1         2
2/2/17            2         2
Run Code Online (Sandbox Code Playgroud)

提前致谢!

python group-by duplicates pandas

6
推荐指数
1
解决办法
3886
查看次数

Pandas - 使用 itertuples 创建列

我有一个pandas.DataFrame和。我还有一个坐标列表。我正在尝试计算纬度和经度与列表中每个坐标对之间的距离(使用半正弦公式)。然后我想返回最小距离,并在数据框中使用该值创建一个新列。AcctIdLatitudeLongitude

但是,我的输出表仅返回循环中最后一行的距离值。我尝试过使用itertuplesiterrows和普通循环,但没有一种方法对我来说非常有效。

df
AcctId   Latitude   Longitude
123      40.50      -90.13
123      40.53      -90.21
123      40.56      -90.45
123      40.63      -91.34

coords = [41.45,-95.13,39.53,-100.42,45.53,-95.32]

for row in df.itertuples():
    Latitude = row[1]
    Longitude = row[2]
    distances = []
    lat = []
    lng = []
    for i in xrange(0, len(coords),2):
          distances.append(haversine_formula(Latitude,coords[i],Longitude,coords[i+1])
          lat.append(coords[i])
          lng.append(coords[i+1])
          min_distance = min(distances)
    df['Output'] = min_distance
Run Code Online (Sandbox Code Playgroud)

期望的输出:

df
AcctId   Latitude    Longitude    Output
123      40.50      -90.13         23.21
123      40.53      -90.21         38.42
123      40.56      -90.45 …
Run Code Online (Sandbox Code Playgroud)

python loops list python-itertools pandas

6
推荐指数
1
解决办法
4145
查看次数

Pandas - 按日期识别最后一行

我试图在 Pandas 数据框中完成两件事:

  1. 根据新的 DateCompleted创建新列Last Row (“是”或“否”)
  2. 捕获当前行的下一个事务,除非它是新的 DateCompleted(在这种情况下标记为 Null)。

原始数据集

        DateCompleted      TranNumber  Sales

    0   1/1/17 10:15AM     3133         130.31
    1   1/1/17 11:21AM     3531         103.12  
    2   1/1/17 12:31PM     3652         99.23  
    3   1/2/17 9:31AM      3689         83.22
    4   1/2/17 10:31AM     3701         29.93
    5   1/3/17 8:30AM      3709         31.31 
Run Code Online (Sandbox Code Playgroud)

所需输出

        DateCompleted      TranNumber   Sales    NextTranSales  LastRow

    0   1/1/17 10:15AM     3133         130.31   103.12         No
    1   1/1/17 11:21AM     3531         103.12   99.23          No
    2   1/1/17 12:31PM     3652         99.23    NaN            Yes
    3   1/2/17 9:31AM      3689         83.22    29.93 …
Run Code Online (Sandbox Code Playgroud)

python group-by shift pandas

5
推荐指数
1
解决办法
3682
查看次数

有效计算Haversine距离的最小值

我有一个数据帧> 2.7mm的坐标,和一个单独的列表〜2000坐标.我试图返回的坐标之间的最小距离每个单排相比,列表中的每个坐标.以下代码适用于小规模(具有200行的数据帧),但是当计算超过2.7MM的行时,它似乎永远运行.

from haversine import haversine

df
Latitude   Longitude
39.989    -89.980
39.923    -89.901
39.990    -89.987
39.884    -89.943
39.030    -89.931

end_coords_list = [(41.342,-90.423),(40.349,-91.394),(38.928,-89.323)]

for row in df.itertuples():
    def min_distance(row):
        beg_coord = (row.Latitude, row.Longitude)
        return min(haversine(beg_coord, end_coord) for end_coord in end_coords_list)
    df['Min_Distance'] = df.apply(min_distance, axis=1)
Run Code Online (Sandbox Code Playgroud)

我知道问题在于发生的大量计算(5.7MM*2,000 = ~11.4BN),并且运行这么多循环的事实非常低效.

根据我的研究,似乎矢量化NumPy函数可能是更好的方法,但我是Python和NumPy的新手,所以我不太确定如何在这种特殊情况下实现它.

理想输出:

df
Latitude   Longitude  Min_Distance
39.989    -89.980     3.7
39.923    -89.901     4.1
39.990    -89.987     4.2
39.884    -89.943     5.9
39.030    -89.931     3.1
Run Code Online (Sandbox Code Playgroud)

提前致谢!

python numpy vectorization haversine pandas

2
推荐指数
1
解决办法
614
查看次数

Pandas - 数据框名称列表?

我做了很多搜索,找不到任何相关的东西。是否有内置函数可以自动生成我创建的 Pandas 数据框列表?

例如,我创建了三个数据框: df1 df2 df3

现在我想要一个像df_list = [df1, df2, df3]这样的列表:这样我就可以遍历它。

python list pandas

2
推荐指数
1
解决办法
3717
查看次数