繁体   English   中英

Pandas:遍历行并给值一个唯一的数字

[英]Pandas: Iterate over rows and give values an unique number

你好,Stackoverflow 的亲爱的人们。 我很想就一个让我有点头疼的问题获得一些指导。 这就是我寻求帮助的部分,因为我的新手知识并不能帮助我解决这个问题。

简而言之:我有一组大量数据,我想知道如何给这些值一个唯一的数字来识别它们。 但不是几次,而是一次。

我们有什么和想要什么

  • 2 列:A 和 B
  • 大约200行。 其中一些是重复的。 我只会发布一个子集。
  • 值可以(但不是必须)出现在 A 列和 B 列中。如果,那么它可能会发生多次:可能只是一次到几次。
  • 每个值只能被赋予一次数字。 这很重要。
  • 以“EB”开头的值应该从 300 开始给出数字。下一个“EB”-值 301,等等。
  • 以“IN”开头的值应该从 400 开始给出数字。下一个“IN”值 401 等。
  • 每个不是以 'EB' 或 'IN' 开头的值都应该从 500 开始指定数字。
  • 我很想把它放在同一个 DataFrame 中。 每个 EB 值及其编号在名称为“C”和“D”的列中,每个“IN”值及其编号在名称为“E”和“F”的列中,其他所有内容都在列中G'和'H'。

输入

d = {
'A': ['Rack Ants', 'EB Animals', 'IN Penguin', 'IN Penguin', 'IN Hippo', 'T-IPS-ACK', 'AA-BMUL', 'VB-SEM-012', 'VE-PAG'], 
'B': ['EB Animals', 'Applications', 'EB Animals', 'EB Animals', 'EB Humans', 'Applications', 'IN Penguin', 'IN Hippo', 'IN Crocodile']
}
df = pd.DataFrame(data=d)
df

我想要的(输出)

点我。 每个值都被赋予了一个唯一的数字!

我的想法(我未能实现)

  • 遍历 A 列和 B 列,将带有“EB”开头的不同值复制到一个数组中。
  • 以“IN”开头的不同值的第二个数组。 (就像上面没有同名的字符串)
  • 不是以“EB”或“IN”开头的每个值的第三个数组。
  • function 可以应用于这三个 arrays 中的每一个:从给定值(例如 300)开始,遍历数组中的每个项目,将它们写入自己的列中。 旁边将是一个自己的列中的数字,列表中的每个项目都增加 +1。 只要数组的长度。

我希望这篇文章不会变得太长。 我很高兴能在这里得到每一次帮助。

这将为您提供您想要的 DataFrame。 在大多数情况下,您都知道解决此问题需要做些什么:

import pandas as pd

def buld_key_df(values:list, number:int) -> pd.DataFrame:
    return pd.DataFrame({
        f'name ({number}s)' : values,
        f'code ({number}s)' : [number + i for i in range(len(values))],
    })

df = pd.DataFrame({
    'A': [
        'Rack Ants', 'EB Animals', 'IN Penguin', 
        'IN Penguin', 'IN Hippo', 'T-IPS-ACK', 
        'AA-BMUL', 'VB-SEM-012', 'VE-PAG'
    ], 
    'B': [
        'EB Animals', 'Applications', 'EB Animals', 
        'EB Animals', 'EB Humans', 'Applications', 
        'IN Penguin', 'IN Hippo', 'IN Crocodile'
    ],
})

unique = pd.concat([df['A'],df['B']]).unique()

df_300 = [x for x in unique if x.startswith('EB ')]
df_400 = [x for x in unique if x.startswith('IN ')]
df_500 = [x for x in unique if x not in df_300 + df_400]

df_300 = buld_key_df(df_300, 300)
df_400 = buld_key_df(df_400, 400)
df_500 = buld_key_df(df_500, 500)

df = pd.concat([df, df_300, df_400, df_500], axis=1).fillna('')

pd.set_option('display.max_columns', 8)
print(df)

Python Tutor 中的示例代码

编辑:将df_300df_400df_500的三个列表组合替换为for循环可能更理想,如下所示。 只有当您有大量的唯一值要分配代码时,这种速度提升才会很明显,如果是这种情况,您可能希望代码为数万而不是数百:

import pandas as pd

def buld_key_df(values:list, number:int) -> pd.DataFrame:
    return pd.DataFrame({
        f'name ({number}s)' : values,
        f'code ({number}s)' : [number + i for i in range(len(values))],
    })

df = pd.DataFrame({
    'A': [
        'Rack Ants', 'EB Animals', 'IN Penguin', 
        'IN Penguin', 'IN Hippo', 'T-IPS-ACK', 
        'AA-BMUL', 'VB-SEM-012', 'VE-PAG'
    ], 
    'B': [
        'EB Animals', 'Applications', 'EB Animals', 
        'EB Animals', 'EB Humans', 'Applications', 
        'IN Penguin', 'IN Hippo', 'IN Crocodile'
    ],
})

unique = pd.concat([df['A'],df['B']]).unique()

df_30k, df_40k, df_50k = [], [], []

for x in unique:
    if x.startswith('EB '):
        df_30k.append(x)
    elif x.startswith('IN '):
        df_40k.append(x)
    else:
        df_50k.append(x)

df_30k = buld_key_df(df_30k, 30000)
df_40k = buld_key_df(df_40k, 40000)
df_50k = buld_key_df(df_50k, 50000)

df = pd.concat([df, df_30k, df_40k, df_50k], axis=1).fillna('')

pd.set_option('display.max_columns', 8)
print(df)

python家教中的示例2代码

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM