GVKun编程网logo

如何在熊猫数据框中进行复杂的计算(如何在熊猫数据框中进行复杂的计算方法)

13

对于想了解如何在熊猫数据框中进行复杂的计算的读者,本文将是一篇不可错过的文章,我们将详细介绍如何在熊猫数据框中进行复杂的计算方法,并且为您提供关于python-如何在熊猫数据框中设置某个字段的值?、不

对于想了解如何在熊猫数据框中进行复杂的计算的读者,本文将是一篇不可错过的文章,我们将详细介绍如何在熊猫数据框中进行复杂的计算方法,并且为您提供关于python-如何在熊猫数据框中设置某个字段的值?、不在熊猫数据框中、在熊猫数据框中删除全零的行、在熊猫数据框中删除重复的 numpy 数组的有价值信息。

本文目录一览:

如何在熊猫数据框中进行复杂的计算(如何在熊猫数据框中进行复杂的计算方法)

如何在熊猫数据框中进行复杂的计算(如何在熊猫数据框中进行复杂的计算方法)

如何解决如何在熊猫数据框中进行复杂的计算?

示例数据框:

df = pd.DataFrame({''sales'': [''2020-01'',''2020-02'',''2020-03'',''2020-04'',''2020-05'',''2020-06''],''2020-01'': [24,42,18,68,24,30],''2020-02'': [24,''2020-03'': [64,70,88,57],''2020-04'': [22,11,44,3,5,78],''2020-05'': [11,35,74,12,69,51]}

我想在下面找到df[''L2'']

我学过pandas roll、groupby等,解决不了。

请阅读L2公式并给我意见

L2 公式

L2(Jan-20) = 24
-------------------
     sales  2020-01
0  2020-01       24
-------------------

L2(Feb-20) = 132  (sum of below matrix 2x2)

     sales  2020-01  2020-02
0  2020-01       24       24
1  2020-02       42       42
-------------------
L2(Mar-20) = 154 (sum of matrix 2x2)

     sales  2020-02  2020-03
0  2020-02       42       24
1  2020-03       18       70
-------------------
L2(Apr-20) = 187 (sum of below maxtrix 2x2)

     sales  2020-03  2020-04
0  2020-03       70       44
1  2020-04       70        3

输出

   Unnamed: 0   sales  Jan-20  Feb-20  Mar-20  Apr-20  May-20   L2   L3
0           0  Jan-20      24      24      64      22      11   24   24
1           1  Feb-20      42      42      24      11      35  132  132
2           2  Mar-20      18      18      70      44      74  154  326
3           3  Apr-20      68      68      70       3      12  187  350
4           4  May-20      24      24      88       5      69   89  545
5           5  Jun-20      30      30      57      78      51  203  433

解决方法

import pandas as pd
import numpy as np


# make a dataset

df = pd.DataFrame({''sales'': [''2020-01'',''2020-02'',''2020-03'',''2020-04'',''2020-05'',''2020-06''],''2020-01'': [24,42,18,68,24,30],''2020-02'': [24,''2020-03'': [64,70,88,57],''2020-04'': [22,11,44,3,5,78],''2020-05'': [11,35,74,12,69,51]})

print(df)

# datawork(L2)

for i in range(0,df.shape[0]):
    
    if i==0:
        df.loc[i,''L2'']=df.loc[i,''2020-01'']
    
    else:
        if i!=df.shape[0]-1:
            df.loc[i,''L2'']=df.iloc[i-1:i+1,i:i+2].sum().sum()
            
        if i==df.shape[0]-1:
             df.loc[i,i-1:i+1].sum().sum()

print(df)

#     sales  2020-01  2020-02  2020-03  2020-04  2020-05     L2
#0  2020-01       24       24       64       22       11   24.0
#1  2020-02       42       42       24       11       35  132.0
#2  2020-03       18       18       70       44       74  154.0
#3  2020-04       68       68       70        3       12  187.0
#4  2020-05       24       24       88        5       69   89.0
#5  2020-06       30       30       57       78       51  203.0
,
Values=f.values[:,1:]
L2=[]
RANGE=Values.shape[0]
for a in range(RANGE):
    if a==0:
        result=Values[a,a]
    else:
        if Values[a-1:a+1,a-1:a+1].shape==(2,1):
            result=np.sum(Values[a-1:a+1,a-2:a])
        
        else:
            result=np.sum(Values[a-1:a+1,a-1:a+1])
         
    L2.append(result)
print(L2)
L2 output:-->[24,132,154,187,89,203]

f["L2"]=L2

f: enter image description here

,

我尝试了另一种方法。 这个方法使用了reshape long(在python中:melt),但是我在python中应用了reshape long两次,因为df中销售和其他列的时间频率是每月而不是每天,所以我再一次reshape long使int列对应于每月日期。 (我用Stata的次数比python多,在Stata中,我只能做一次reshape很长时间,因为它有每月的时间频率,而且reshape任务比pandas,python要容易得多)

有兴趣的可以看看

# 00.module

import pandas as pd
import numpy as np
from order import order # https://stackoverflow.com/a/68464246/16478699

# 0.make a dataset

df = pd.DataFrame({''sales'': [''2020-01'',51]}
                  )
df.to_stata(''dataset.dta'',version=119,write_index=False)
print(df)

# 1.reshape long(in python: melt)

t = list(df.columns)
t.remove(''sales'')
df_long = df.melt(id_vars=''sales'',value_vars=t,var_name=''var'',value_name=''val'')
df_long[''id''] = list(range(1,df_long.shape[0] + 1))  # make id for another resape long
print(df_long)

# 2.another reshape long(in python: melt,reason: make int(col name: tid) corresponding to monthly date of sales and monthly columns in df)

df_long2 = df_long.melt(id_vars=[''id'',''val''],value_vars=[''sales'',''var''])
df_long2[''tid''] = df_long2[''value''].apply(lambda x: 1 + list(df_long2.value.unique()).index(x))
print(df_long2)

# 3.back to wide form with tid(in python: pd.pivot)

df_wide = pd.pivot(df_long2,index=[''id'',columns=''variable'',values=[''value'',''tid''])
df_wide.columns = df_wide.columns.map(lambda x: x[1] if x[0] == ''value'' else f''{x[0]}_{x[1]}'')  # change multiindex columns name into just normal columns name
df_wide = df_wide.reset_index()
print(df_wide)

# 4.make values of L2

for i in df_wide.tid_sales.unique():

    if list(df_wide.tid_sales.unique()).index(i) + 1 == len(df_wide.tid_sales.unique()):
        df_wide.loc[df_wide[''tid_sales''] == i,''L2''] = df_wide.loc[(((df_wide[''tid_sales''] == i) | (
                    df_wide[''tid_sales''] == i - 1)) & ((df_wide[''tid_var''] == i - 1) | (
                    df_wide[''tid_var''] == i - 2))),''val''].sum()

    else:
        df_wide.loc[df_wide[''tid_sales''] == i,''L2''] = df_wide.loc[(((df_wide[''tid_sales''] == i) | (
                    df_wide[''tid_sales''] == i - 1)) & ((df_wide[''tid_var''] == i) | (
                    df_wide[''tid_var''] == i - 1))),''val''].sum()

print(df_wide)

# 5.back to shape of df with L2(reshape wide,in python: pd.pivot)

df_final = df_wide.drop(columns=df.filter(regex=''^tid''))  # no more columns starting with tid needed
df_final = pd.pivot(df_final,index=[''sales'',''L2''],columns=''var'',values=''val'').reset_index()
df_final = order(df_final,''L2'',f_or_l=''last'')  # order function is made by me
print(df_final)

python-如何在熊猫数据框中设置某个字段的值?

python-如何在熊猫数据框中设置某个字段的值?

可以说我有一个像这样的熊猫数据框:

d = {'col1': [1,2,3,4],'col2': ['','','']}
df = pd.DataFrame(data=d)

出于某种原因,我必须遍历其所有行,并为col2赋予一定的值.我的循环现在在i = 1,并且col2应该是“检查!”.

似乎很容易

df.iloc[i]['col2']='Check'

但是,这会引发警告,并且是a link,似乎是有必要的,因为df.iloc [i] [‘col2’]只会返回我的empy”,而不是“ Check!”.这应该.

几乎询问了(并解决了)here相同的问题,但是,现在不赞成使用键.is_copy命令,它出现了(我每次都不会收到错误,很奇怪……),因此我很犹豫使用它.

所以

ri = df.iloc[i]
ri.is_copy = False
newval = 'Check!'
ri['col2']=newval
df.iloc[i]=ri

可以正常工作,虽然很不错,但很显然,它将很快停止工作,因此这不是最佳选择.

编辑

在问题中添加警告也许是有道理的,以便使其更加清晰并增加其可搜索性:

In [1]: df.iloc[i]['col2']='Check'
Out[1]: /some/path/ipython:1: SettingWithcopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
最佳答案
这是必须通过位置将位置设置为DataFrame.iat,但必须通过列将位置设置为get_loc

i = 1
df.iat[i,df.columns.get_loc('col2')]='Check'
#slowier
#df.iloc[i,df.columns.get_loc('col2')]='Check'

或通过标签设置为DataFrame.at

i = 1
df.at[df.index[i],'col2']='Check'
#slowier
#df.loc[df.index[i],'col2']='Check'

对于默认的RangeIndex:

df.at[i,'col2']='Check'
print (df)
   col1   col2
0     1       
1     2  Check
2     3       
3     4       

不在熊猫数据框中

不在熊猫数据框中

假设 df1 是

   V1      V2      V3
0  aaa     34      67
1  aaa     34    4545
2  bbb     23  342344
3  bbb     56     776
4  ccc    878     754
5  ccc    454      66
6  ddd  78768      46
7  ddd     56     646

df2 是

   V1      V2   V3
0  aaa     34   67
1  ddd  78768   46
2  ddd     56  646

那么没有来自 df2 的行的 df1 由

给出
df =pd.merge(df1,df2,indicator=True,how='outer').query('_merge=="left_only"').drop('_merge',axis=1)

这是

 V1    V2      V3
1  aaa   34    4545
2  bbb   23  342344
3  bbb   56     776
4  ccc  878     754
5  ccc  454      66

在熊猫数据框中删除全零的行

在熊猫数据框中删除全零的行

我可以使用pandas dropna()功能来删除将部分或全部列设置为NA的行。是否存在用于删除所有列的值为0的行的等效函数?

P   kt  b   tt  mky depth1   0   0   0   0   02   0   0   0   0   03   0   0   0   0   04   0   0   0   0   05   1.1 3   4.5 2.3 9.0

在此示例中,我们要删除数据帧的前4行。

谢谢!

答案1

小编典典

事实证明,这可以向量化的方式很好地表达:

> df = pd.DataFrame({''a'':[0,0,1,1], ''b'':[0,1,0,1]})> df = df[(df.T != 0).any()]> df   a  b1  0  12  1  03  1  1

在熊猫数据框中删除重复的 numpy 数组

在熊猫数据框中删除重复的 numpy 数组

只需使用 applymap() 方法:-

cars=cars.applymap(lambda x:set(x))
cars=cars.applymap(lambda x:list(x))

编辑:如果您不想在 z 列中应用此条件,请使用 apply() 方法:-

cars['x']=cars['x'].apply(lambda x:set(x)).apply(lambda x:list(x))
cars['y']=cars['y'].apply(lambda x:set(x)).apply(lambda x:list(x))

今天关于如何在熊猫数据框中进行复杂的计算如何在熊猫数据框中进行复杂的计算方法的讲解已经结束,谢谢您的阅读,如果想了解更多关于python-如何在熊猫数据框中设置某个字段的值?、不在熊猫数据框中、在熊猫数据框中删除全零的行、在熊猫数据框中删除重复的 numpy 数组的相关知识,请在本站搜索。

本文标签: