[英]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.