小编ALo*_*llz的帖子

Python Pandas:比较一列中的两个数据帧,并返回另一个数据帧中两个数据帧的行内容

  1. 我正在使用两个csv文件并导入为dataframe,df1和df2
  2. df1有50000行,df2有150000行.
  3. 我想比较(遍历每一行)df2的'时间'和df1,找到时间的差异并返回对应于相似行的所有列的值,保存在df3(时间同步)
  4. 例如,35427949712(df1中的'time')最接近或等于 35427949712(df2中的'time'),所以我想将内容返回到df1('velocity_x'和'yaw')和df2('速度'和'偏航')并保存在df3中
  5. 为此,我使用了两种技术,如代码所示.
  6. 代码1需要很长时间才能执行72小时,这不是练习,因为我有很多csv文件
  7. 代码2给了我"内存错误",内核死了.

如果考虑到计算时间,内存和功耗(英特尔酷睿i7-6700HQ,8 GB Ram),我会得到一个更强大的问题解决方案,那将会很棒

这是样本数据,

import pandas as pd
df1 = pd.DataFrame({'time': [35427889701, 35427909854, 35427929709,35427949712, 35428009860], 
                    'velocity_x':[12.5451, 12.5401,12.5351,12.5401,12.5251],
                   'yaw' : [-0.0787806, -0.0784749, -0.0794889,-0.0795915,-0.0795472]})

df2 = pd.DataFrame({'time': [35427929709, 35427949712, 35427009860,35427029728, 35427049705], 
                    'velocity':[12.6583, 12.6556,12.6556,12.6556,12.6444],
                    'yawrate' : [-0.0750492, -0.0750492, -0.074351,-0.074351,-0.074351]})

df3 = pd.DataFrame(columns=['time','velocity_x','yaw','velocity','yawrate'])
Run Code Online (Sandbox Code Playgroud)

代码1

 for index, row in df1.iterrows():
    min=100000
    for indexer, rows in df2.iterrows():
        if abs(float(row['time'])-float(rows['time']))<min:
            min = abs(float(row['time'])-float(rows['time']))
            #storing the position 
            pos = indexer
    df3.loc[index,'time'] = df1['time'][pos]
    df3.loc[index,'velocity_x'] = df1['velocity_x'][pos]
    df3.loc[index,'yaw'] …
Run Code Online (Sandbox Code Playgroud)

python algorithm python-3.x pandas data-science

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

Pandas 数据框过滤器和 For 循环

我有一个包含许多列的数据框。我正在尝试过滤其中一列(“区域”)并根据“区域”列中的这 4 个区域中的每一个创建一个单独的数据框。然后在这 4 个单独的数据帧中的每一个上运行包含大量计算的大代码块,而不必单独重写大代码块 4 次。

我知道我可以使用 .isin 函数进行列过滤,并为我的 4 个地区(美国、新兴市场、欧洲、亚洲)执行此操作:

US = df[df['Region'].isin('US')]
EM = df[df['Region'].isin('EM')]
Europe = df[df['Region'].isin('Europe')]
Asia = df[df['Region'].isin('Asia')]
Run Code Online (Sandbox Code Playgroud)

然后在 4 个新数据帧上运行我的代码块。但是我会分别执行我的大块计算代码 4 次,这太混乱了。我怎样才能在循环中做到这一点,所以我只需要一次编写我的大代码块?如果除了 for 循环之外,我还可以使用另一个函数来执行此操作,这也很棒。感谢任何帮助 - 尝试学习。

虚拟代码:

df = pd.DataFrame({'a':[1,2,3,4,5,6], 'b':['cats','dogs','birds','pianos','elephant','dinos'], 'Region' : ['EM', 'US', 'US', 'Europe', 'Asia', 'Asia']})
Run Code Online (Sandbox Code Playgroud)

python for-loop pandas pandas-groupby

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

MultiIndex 数据帧的平均值

我有以下数据框

                 A     B    C    D    E    F
Algo     T                                   
X        1     0.2   0.2  0.0  0.0  0.2   0.2
         2     0.0   0.0  0.0  0.0  0.0   0.0
Y        15    0.7   1.4  1.5  1.0  0.7   1.4
         30    0.5   0.3  1.0  0.4  0.5   0.4
         45    0.2   0.0  0.6  0.0  0.2   0.0
Z        30    1.8   2.3  0.6  0.7  1.8   2.3
         60    1.0   0.5  0.3  0.4  1.0   0.5
         90    0.3   0.2  0.0  0.2  0.4   0.2
Run Code Online (Sandbox Code Playgroud)

我想知道如何在底部有一行显示 A、B、C、... F 列的平均值

                 A     B    C    D    E    F
Algo     T …
Run Code Online (Sandbox Code Playgroud)

python multi-index pandas

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

pandas 列中的连续值

我有熊猫df['realize']

time                      realize
2016-01-18 08:25:00     -46.369083
2016-01-19 14:30:00     -819.010738
2016-01-20 11:10:00    -424.955847
2016-01-21 07:15:00     27.523859
2016-01-21 16:10:00     898.522762
2016-01-25 00:00:00    761.063545
Run Code Online (Sandbox Code Playgroud)

哪里time

df.index = df['time']
df.index = pd.to_datetime(df.index)
Run Code Online (Sandbox Code Playgroud)

哪里df['realize']

In: type(df['realize'])
Out: pandas.core.series.Series
Run Code Online (Sandbox Code Playgroud)

我想计算连续值,规则很简单 ( df['realize'] > 0, df['realize'] < 0)

预计输出:

time                      realize    Consecutive
2016-01-18 08:25:00     -46.369083    1
2016-01-19 14:30:00     -819.010738   2
2016-01-20 11:10:00    -424.955847    3
2016-01-21 07:15:00     27.523859     1
2016-01-21 16:10:00     898.522762    2
2016-01-25 00:00:00    761.063545     3
Run Code Online (Sandbox Code Playgroud)

我阅读了有关循环的主题,但没有找到我需要的内容。预先感谢您的帮助。

python dataframe pandas

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

第一年的天数不准确

我编写了以下代码,以便在年末的某一天开始该年的支付期。出于某种原因,它告诉我 12 月 22 日(第一年)是星期六。在线日历告诉我那是在星期四。

from datetime import datetime, timedelta

def pp_firstday(year):
    print(type(year))
    firstday = datetime(1,12,22,0,0,0)
    yr = 2
    print(yr, " ", firstday.strftime("%b/%d/%Y  %a"))
    yr = 3
    while int(firstday.strftime("%Y")) != year-1:
        firstday += timedelta(weeks=52)
        if int(firstday.strftime("%m")) <= 12 and int(firstday.strftime("%d")) <= 12:
            firstday += timedelta(weeks=2)
            print("27: ",firstday.strftime("%b/%d/%Y  %a"))
        print(yr, " ",firstday.strftime("%b/%d/%Y  %a"))
        yr += 1
    return firstday

year = int(input("Year >>>")) result=pp_firstday(year) print(result.strftime("%b/%d/%Y  %a"))
Run Code Online (Sandbox Code Playgroud)

问题是,当你运行它时,输出显示: 2 Dec/22/0001 Sat Python 认为 12 月 22 日,第 1 年是星期六。到 2019 年时,输出显示:2020 Dec/21/2019 Sat,因此问题已得到纠正。是什么赋予了?

python datetime

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

使用 pd.merge 复制 pd.concat

是否可以使用以下方法复制以下内容 pd.merge

a = pd.DataFrame(dict(x=[1,2], y=[5,5]))
b = pd.DataFrame(dict(x=[7,7], y=[12,13]))
pd.concat([a,b],axis=1)
Run Code Online (Sandbox Code Playgroud)

哪个输出

   x  y  x   y
0  1  5  7  12
1  2  5  7  13

Run Code Online (Sandbox Code Playgroud)

因为这将使我能够为列名添加后缀。

我希望以下内容起作用:

pd.merge(a, b, how = 'outer',)
Run Code Online (Sandbox Code Playgroud)

但这会返回:

   x   y
0  1   5
1  2   5
2  7  12
3  7  13

Run Code Online (Sandbox Code Playgroud)

我希望输出是:

   x_l  y_l  x_r   y_r
0  1    5    7    12  
1  2    5    7    13  
Run Code Online (Sandbox Code Playgroud)

python merge join pandas

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

在 python pandas 中创建交叉表,显示存在哪些值

鉴于以下数据:

pd.DataFrame(dict(
    name = ['a', 'a', 'a', 'b', 'b', 'b'],
    vals = [1, 2 , 3, 99, 3, 4]
))
Run Code Online (Sandbox Code Playgroud)

看起来像:

  name  vals
0    a     1
1    a     2
2    a     3
3    b    99
4    b     3
5    b     4
Run Code Online (Sandbox Code Playgroud)

我想知道如何创建以下内容:

     1     2    3      4     99
a  true  true  true  false  false
b  false false true  false  true
Run Code Online (Sandbox Code Playgroud)

注意 -上面的true和的确切值false并不那么重要,我目前不知道如何创建这种类型的表。

python data-manipulation crosstab pandas

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

加速 Pandas 迭代

我有包含 3 列的 DataFrame:CustomerId、Amount 和 Status(成功或失败)。DataFrame 没有以任何方式排序。一个 CustomerId 可以在 DataFrame 中重复多次。

我想使用以下逻辑在此 DataFrame 中引入新列:

df[totalamount]= 状态为成功的每个客户的金额总和。

我已经有一个正在运行的代码,但是 df.iterrows 需要太多时间。因此请您提供替代方法,如熊猫矢量化或 numpy 矢量化。

例如,我想从前三列创建 'totalamount' 列:

   CustomerID  Amount   Status  totalamount
0           1       5  Success          105 # since both transatctions were successful
1           2      10   Failed           80 # since one transaction was successful
2           3      50  Success           50
3           1     100  Success          105
4           2      80  Success           80
5           4      60   Failed            0
Run Code Online (Sandbox Code Playgroud)

data-analysis dataframe python-3.x pandas

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

基于条件累积和的多个 Pandas 列

我有一个dataframe包含多个“堆栈”及其相应的“长度”。

df = pd.DataFrame({'stack-1-material': ['rock', 'paper', 'paper', 'scissors', 'rock'], 'stack-2-material': ['rock', 'paper', 'rock', 'paper', 'scissors'], 'stack-1-length': [3, 1, 1, 2, 3], 'stack-2-length': [3, 1, 3, 1, 2]})

  stack-1-material stack-2-material  stack-1-length  stack-2-length
0             rock             rock               3               3
1            paper            paper               1               1
2            paper             rock               1               3
3         scissors            paper               2               1
4             rock         scissors               3               2
Run Code Online (Sandbox Code Playgroud)

我试图为每种材料创建一个单独的列,跟踪长度的累积总和,而不管它们是哪个“堆栈”。我试过使用,groupby但只能将累积总和放入一列。这是我要找的:

  stack-1-material stack-2-material  stack-1-length  stack-2-length  rock_cumsum  paper_cumsum  scissors_cumsum
0             rock             rock               3               3            6             0                0
1            paper            paper               1 …
Run Code Online (Sandbox Code Playgroud)

cumulative-sum python-3.x pandas

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

使用最接近缺失值的日期的值来填充缺失值

我知道如何使用带有填充或填充的groupby方法来估算缺少的值。但是我的问题是,我需要首先在“日期”列中找到与“得分”列中的空值最接近的日期,如果分数列中的值不为空,则用该值进行插补。如果该值为空,则需要搜索另一个最近的日期。我可以遍历行并执行此操作,但是速度非常慢。

这是数据的示例:

df = pd.DataFrame(
     {'cn': [1, 1, 1, 1, 2, 2, 2], 
      'date': ['01/10/2017', '02/09/2016', '02/10/2016','01/20/2017', '05/15/2019', '02/10/2016', '02/10/2017'],
      'score': [np.nan, np.nan, 6, 5, 4, np.nan, 8]})

    cn  date    score
0   1   01/10/2017  NaN
1   1   02/09/2016  NaN
2   1   02/10/2016  6
3   1   01/20/2017  5
4   2   05/15/2019  4
5   2   02/10/2016  NaN
6   2   02/10/2017  8.0
Run Code Online (Sandbox Code Playgroud)

输出应该是

    cn  date    score
0   1   01/10/2017  5
1   1   02/09/2016  6
2   1   02/10/2016  6
3   1   01/20/2017  5
4 …
Run Code Online (Sandbox Code Playgroud)

python missing-data pandas

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