Python Pandas:通过从列表中映射来创建列

Python Pandas:通过从列表中映射来创建列,python,pandas,dictionary,mapping,Python,Pandas,Dictionary,Mapping,我有一个熊猫数据框和一个dict,如下所示。我想在dataframe中创建一个新列,它基于dict中的哪个列表显示行的索引 df = pd.DataFrame({ 'a':['x', 'y', 'z'], 'b':[1, 2, 3], 'c':[10, 20, 30], }) df = df.set_index('a') mydict = { 'g1':['a', 'b', 'y'], 'g2':['x', 'k', 'l'], 'g3':['m'

我有一个熊猫数据框和一个dict,如下所示。我想在dataframe中创建一个新列,它基于dict中的哪个列表显示行的索引

df = pd.DataFrame({
    'a':['x', 'y', 'z'],
    'b':[1, 2, 3],
    'c':[10, 20, 30],
})
df = df.set_index('a')
mydict = {
    'g1':['a', 'b', 'y'],
    'g2':['x', 'k', 'l'],
    'g3':['m', 'l', 'z'],
}
预期产出

   b   c   g
a       
x  1  10  g2
y  2  20  g1
z  3  30  g3

我甚至不知道如何开始解决这个问题。是否可以创建自定义函数并使用该函数映射?但这是否足够呢?在我的实际用例中,“df”中可能有数十万行,“mydict”中大约有几百个键,每个列表将包含数万项。此外,我将主要处理整数而不是字符串,如图所示。

您需要将列表字典扁平化为具有标量键:值对的简单字典。由于字典需要唯一的键,如果多个列表包含相同的值,则该值最终会映射到它所属的最后一个列表的键(这很好,因为您不关心哪个)


您需要将列表字典扁平化为具有标量键:值对的简单字典。由于字典需要唯一的键,如果多个列表包含相同的值,则该值最终会映射到它所属的最后一个列表的键(这很好,因为您不关心哪个)


这将遍历索引值并在字典的值中查找它们。它的运行速度比Alollz解决方案快7-10倍**,尽管它看起来不太漂亮

g = []
for i in df.index.values:
    for k in mydict:
        if i in mydict[k]:
            g.append(k)
            break
df['g'] = g

**对于小数据量(如问题中的示例),速度更快。随着数据量的增加,Alolz的解决方案将变得更快。Alollz创建值:key dict有很多开销,因此对于少量数据,这会更快。

这会循环索引值,并在字典的值中查找它们。它的运行速度比Alollz解决方案快7-10倍**,尽管它看起来不太漂亮

g = []
for i in df.index.values:
    for k in mydict:
        if i in mydict[k]:
            g.append(k)
            break
df['g'] = g

**对于小数据量(如问题中的示例),速度更快。随着数据量的增加,Alolz的解决方案将变得更快。Alollz创建值:key dict有很多开销,因此对于少量数据,这会更快。

'l
'出现在该字典中不同键的列表中,那么在这种情况下应该发生什么呢?通常不会发生,但如果发生这种情况,“g2”或“g3”都可以。该词典中不同键的列表中会出现“l”,那么在这种情况下会发生什么?通常不会发生这种情况,但如果发生这种情况,“g2”或“g3”都可以。这看起来是一个很好的解决方案。我将在更大的数据集上测试它,并接受它作为答案。同时+1,非常感谢!!这看起来是一个很好的解决方案。我将在更大的数据集上测试它,并接受它作为答案。同时+1,非常感谢!!谢谢但是嵌套的循环让我害怕:)我会测试!当数据帧变大时,这种方法会变得慢很多,但对于小的~1000行数据帧,这种方法非常快。但是嵌套的循环让我害怕:)我会测试!当数据帧变大时,这种方法会变得慢很多,但对于小到千行的数据帧,这种方法非常快