Pandas:当相同的描述出现在不同的代码中时,如何重命名鳕鱼的描述?

cgvd09ve  于 2023-02-11  发布在  其他
关注(0)|答案(3)|浏览(127)

我试过chat gpt,但是没有用。我有一个可重复的 Dataframe ,其中相同的描述出现在两个代码中。但是我需要在末尾添加一个“X”来区分描述(例如)。也就是说,每个“gce_cod”应该只有一个“gce_descri”,每个“gce_descri”应该只有一个“gce_cod”,而不管其他列(在本例中为“time”)

df = pd.DataFrame({
'time': [1,1,1,1,1,1,2,2,2,2,2,2],
'gce_cod': ['A1', 'A2', 'A3', 'A4', 'A1','A5','A1', 'A2', 'A3', 'A4', 'A1','A5'],
'gce_descri': ['description1', 'description2', 'description1', 'description3', 'description1','description2','description1', 'description2', 'description1', 'description3', 'description1','description2']})

输出应为:

df = pd.DataFrame({
'time': [1,1,1,1,1,1,2,2,2,2,2,2],
'gce_cod': ['A1', 'A2', 'A3', 'A4', 'A1','A5','A1', 'A2', 'A3', 'A4', 'A1','A5'],
'gce_descri': ['description1', 'description2', 'description1X', 'description3', 'description1','description2X','description1', 'description2', 'description1X', 'description3', 'description1','description2X']})

非常感谢帮助!

n7taea2i

n7taea2i1#

我尝试了一段时间后得出了这个解决方案:

首先,我用水果表情符号重新制作了你的数据框,让变化更明显:

df = pd.DataFrame({
'time': [1,1,1,1,1,1,1,2,2,2,2,2,2],
'gce_cod': ['A1', 'A2', 'A2', 'A3', 'A4', 'A1','A5','A1', 'A2', 'A3', 'A4', 'A1','A5'],
'gce_descri': ['🍊', '🥝','🥝', '🍊', '🍎', '🍊','🥝','🍊', '🥝', '🍊', '🍎', '🍊','🥝']})

则此解决方案需要对数据进行排序

因为我们将对结果的出现次数进行累计求和,但是由于这个计数有一些条件,我们将创建另一个列,其中包含一个键,以便稍后对df进行分组。

df = df.sort_values(["time","gce_cod","gce_descri"])
df['key'] = df['time'].astype(str) + '_' + df['gce_descri'] + '_' + 
df['gce_cod']

然后是棘手的部分。

我所理解的这个累积和的条件是:
1.每个总和的范围是一个时间段
1.仅在以下情况下才对值进行计数:a)结果重复B)出现不同的“gce_cod”
所以我为变量'key'的唯一出现做了另一个df,这个变量是我们在最后一步做的,Regard是一个由我们开始df的三个变量组成的变量,那么我们就不能把这个累加和做在'count'变量中。

uniqueKeysDf = pd.DataFrame(dict(
key=df.key.unique(),
descri=[string[:3] for string in df.key.unique()]
))
uniqueKeysDf['count'] = uniqueKeysDf.groupby(['descri']).cumcount()+1

最后,我们通过“key”变量合并df,并根据“count”值重复水果数量。

df = pd.merge(df,uniqueKeysDf[['key', 'count']],'left',on='key')
df.gce_descri =  df.apply(lambda x: x['gce_descri'] + (x['count'] - 1) * 
x['gce_descri'] if x['count'] > 1 else x['gce_descri'], axis=1)
df = df.drop(['key', 'count'], axis=1)

这就是我们努力的成果

time    gce_cod gce_descri
0   1   A1  🍊
1   1   A1  🍊
2   1   A2  🥝
3   1   A2  🥝
4   1   A3  🍊🍊
5   1   A4  🍎
6   1   A5  🥝🥝
7   2   A1  🍊
8   2   A1  🍊
9   2   A2  🥝
10  2   A3  🍊🍊
11  2   A4  🍎
12  2   A5  🥝🥝
r6vfmomb

r6vfmomb2#

使用2个布尔掩码:一个用于gce_cod/gce_descri列的两个副本(按行),一个用于gce_descri列,以进一步计算它们之间的 * 按位异或 * ^

df['gce_descri'] = np.where(df.duplicated() ^ df['gce_descri'].duplicated(),
                            df['gce_descri']+'X', df['gce_descri'])
gce_cod     gce_descri
0      A1   description1
1      A2   description2
2      A3  description1X
3      A4   description3
4      A1   description1
5      A5  description2X
nhaq1z21

nhaq1z213#

首先,使用pd.Dataframe.duplicated查找重复项
然后使用pd.where将那些重复的行替换为您自己的值。

find_duplicates = df['gce_descri'].duplicated()

df['gce_descri'] = df['gce_descri'].where(~find_duplicates, df['gce_descri'] + '_X')

输出
Output

注意:-将更改“gce_descri”中的所有重复值

相关问题