繁体   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