簡體   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