我想根据下面的条件对现有的数据进行过滤。这是数据集。还有几个附加的条件,我正在设法找到解决办法。
条件:
我需要将它们分类为retention1、retention2或两者兼而有之。如果值在retention1中,而retention2记录都为None,则在retention1中对其进行分类。类似地,对于retention2,retention2列有值,retention1没有值。但是对于混合保留--对于每个“名称”记录,您可以将retention1作为None,retention2为None。但是列的有效值应该是retention1或retention2,如数据集中所示。分类时,将集群ID与AZ_URL进行比较。如果集群ID位于AZ_URL的第二部分,那么正确的值就是retention1或retention2的第一个元素。将集群ID与AZ_URL进行比较。如果集群ID位于AZ_URL的第一部分,那么正确的值是retention1或retention2的第二个元素。
Retention1:名称def,有两个记录,retention2的值为None,retention1为3;4和3;1,所以检查AZ_URL中的clusterID,因为它位于AZ_URL的第一部分,在下面的输出记录中保留1的第二部分。
Retention2:关于rls,clusterID bn4323在AZ_URL的第二部分。因此,提取第一部分的retention2 -7和第一部分快照保留-每月.
混合保留:名称abc,cgh来混合保留,因为他们都有两个记录和record1有retention1不是无(和retention2是无)和record2有retention2而不是无( retention1是无)
我试着用熊猫来编写下面的代码,但是我找不到它的功能。
Retention1计算:
m=df['retention1'].notna()
n=df['retention2'].notna()
df3=df.loc[m & ~n,['Name', 'ClusterID','Az_URL','retention1']].dropna(axis=1)
df3['retention1']=df3['retention1'].str.extract(r'(\d+)',expand=False)Retention2计算:
df=df.replace({'None':None})
m=df['retention1'].notna()
n=df['retention2'].notna()
df4=df.loc[n & ~m,['Name', 'ClusterID','Az_URL','retention2', 'retention snapshot']].dropna(axis=1)
df4['retention2']=df4['retention2'].str.extract(r'(\d+)',expand=False)
df4['retention2']=df4['retention2'].str.extract(r'([a-zA-Z ]+)',expand=False)混合保持率计算:
df=df.replace({'None':None})
m=df['retention1'].notna()
n=df['retention2'].notna()
df_merge = df.groupby("name").agg(lambda x['retention1']: list(['retention1']))我需要一些建议来改进这些新的数据格式,lambda,因为它将有助于更好地填充报告。
发布于 2021-08-21 04:31:18
您可以通过loc尝试,因为在'retension1‘和'retension2’中没有备用的,所以一个条件就可以了:
df=df.replace({'None':None})
m=df['retention1'].notna()
#m=(df['retention1'].notna()) & (df['retention2'].isna())
df1=df.loc[m].dropna(axis=1)
df1['retention1']=df1['retention1'].str.extract(r'(\d+)',expand=False)
df2=df.loc[~m].dropna(axis=1)
df2['retention2']=df2['retention2'].str.extract(r'(\d+)',expand=False)df1输出
Name Policy retention1
0 abc 123 5
1 cgh 789 1df2输出
Name Policy retention2
0 abc 456 6
1 cgh 675 2发布于 2021-08-21 04:29:38
你的意思是:
>>> retention1 = df.loc[df['retention1'].notna()].drop('retention2', axis=1).reset_index(drop=True)
>>> retention1['retention1'] = retention1['retention1'].str.extract('(\d)')
>>> retention1
Name Policy retention1
0 abc 123 5
1 cgh 789 1
>>> retention2 = df.loc[df['retention2'].notna()].drop('retention1', axis=1).reset_index(drop=True)
>>> retention2['retention2'] = retention2['retention2'].str.extract('(\d)')
>>> retention2
Name Policy retention2
0 abc 456 6
1 cgh 675 2
>>> https://stackoverflow.com/questions/68870093
复制相似问题