簡體   English   中英

獲取具有特定值的單元格的列和行標簽

[英]Getting column and row label for cells with specific value

我有一個包含交叉引用的CSV文件,這意味着行被標記了,列被標記了,並且單元格都包含一個“ X”,兩者都適用(假設我們談論的是糖果,請使用顏色和風味,所以一個文件是某種糖果和紅色的味道像草莓,綠色的味道像蘋果等,這意味着):

Candy Q     red     green       blue
apple               X
strawberry  X
smurf                           X
dunno lol   X       X           X

我可以將它們加載到pandas數據框中,對其進行讀取,然后對其進行遍歷,但是我沒有設法獲取包含X的單元格的描述符。我嘗試了pandas提供的三種不同的迭代器,但從未獲得過所需的信息。 。 我已經嘗試過使用迭代器和增量進行index-based value-checking ,但是它變得相當混亂,因此我將其丟棄。

理想情況下,輸出為{apple: green},{strawberry: red}, {smurf: blue},{dunno lol: [red, green, blue]}

我將如何獲得這些references

編輯:我可能需要添加:我不預先知道列或行的名稱,因為它們不統一,它們遵循一定的邏輯,但是通常,我無法定義嚴格的架構。

更新#2:代碼,根據Coldspeed和Scott Boston的組合解決方案(加上一個小修正):

files = glob.glob(mappings_path + '\\*.csv')
# iterate over the list getting each file
for file in files:
    # open each file
    with open(file,'r') as f:
        # read content into pandas dataframe
        df = pd.read_csv(f, delimiter=";", encoding='utf-8')
        # set index to first column (and only column)
        df = df.set_index(df.iloc[:, 0])

        d = defaultdict(list)
        for x, y in zip(*np.where(df.notnull())):
            d[df.index[x]].append(df.columns[y])

        res = dict(d)
        for k, v in res.items():
            del v[0]
        logger.info(res)

它糾正了描述符的問題(在示例中為Candy Q )在每個結果列表中首先出現: {'apple': ['Candy Q','green'], 'strawberry': ['Candy Q','red']等。 這是CSV文件的鏈接,以防您需要它們或想知道這是什么 ,或者,如果您不信任人們在Internet上發布的鏈接,則此頁面上的第四次下載

謝謝大家的幫助!

df

      Candy Q  red green blue
0       apple  NaN     X  NaN
1  strawberry    X   NaN  NaN
2       smurf  NaN   NaN    X
3   dunno lol    X     X    X

df = df.set_index('Candy Q')

有點hacky,但速度很快。

j = df.notnull()\
      .dot(df.columns + '_')\
      .str.strip('_')\
      .str.split('_')\
      .to_dict()

print(j)
{
    "dunno lol": [
        "red",
        "green",
        "blue"
    ],
    "smurf": [
        "blue"
    ],
    "strawberry": [
        "red"
    ],
    "apple": [
        "green"
    ]
} 

這涉及在列和掩碼(指定單元格是否具有X )之間執行“點”乘積。

這里需要說明的是,分離器使用的列名( _ -下划線,在這種情況下)不應該存在的部分列名。 在這種情況下,請選擇該列中不存在的任何分隔符,這應該可行。

哪里df:

            red green blue
Candy Q                   
apple       NaN     X  NaN
strawberry    X   NaN  NaN
smurf       NaN   NaN    X
dunno lol     X     X    X

您可以使用np.where返回索引:

from collections import defaultdict

d = defaultdict(list)
for x, y in zip(*np.where(df.notnull())):
     d[df.index[x]].append(df.columns[y])

dict(d)

輸出:

{'apple': ['green'],
 'dunno lol': ['red', 'green', 'blue'],
 'smurf': ['blue'],
 'strawberry': ['red']}

感謝@cᴏʟᴅsᴘᴇᴇᴅ,感謝您的編輯和簡化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM