对于想了解如何在熊猫数据框中进行复杂的计算的读者,本文将是一篇不可错过的文章,我们将详细介绍如何在熊猫数据框中进行复杂的计算方法,并且为您提供关于python-如何在熊猫数据框中设置某个字段的值?、不
对于想了解如何在熊猫数据框中进行复杂的计算的读者,本文将是一篇不可错过的文章,我们将详细介绍如何在熊猫数据框中进行复杂的计算方法,并且为您提供关于python-如何在熊猫数据框中设置某个字段的值?、不在熊猫数据框中、在熊猫数据框中删除全零的行、在熊猫数据框中删除重复的 numpy 数组的有价值信息。
本文目录一览:- 如何在熊猫数据框中进行复杂的计算(如何在熊猫数据框中进行复杂的计算方法)
- 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:
我尝试了另一种方法。 这个方法使用了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-如何在熊猫数据框中设置某个字段的值?
可以说我有一个像这样的熊猫数据框:
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 数组
只需使用 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 数组的相关知识,请在本站搜索。
本文标签: