我有一个大的数据帧(> 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) 如果该行符合条件,我将尝试创建一个重复行。在下表中,我根据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)
提前致谢!
我有一个pandas.DataFrame和。我还有一个坐标列表。我正在尝试计算纬度和经度与列表中每个坐标对之间的距离(使用半正弦公式)。然后我想返回最小距离,并在数据框中使用该值创建一个新列。AcctIdLatitudeLongitude
但是,我的输出表仅返回循环中最后一行的距离值。我尝试过使用itertuples、iterrows和普通循环,但没有一种方法对我来说非常有效。
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) 我试图在 Pandas 数据框中完成两件事:
原始数据集
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) 我有一个数据帧与> 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)
提前致谢!
我做了很多搜索,找不到任何相关的东西。是否有内置函数可以自动生成我创建的 Pandas 数据框列表?
例如,我创建了三个数据框: df1 df2 df3
现在我想要一个像df_list = [df1, df2, df3]这样的列表:这样我就可以遍历它。