天道酬勤,学无止境

根据匹配的列映射多个数据框(Mapping multiple dataframe based on the matching columns)

问题

我有 25 个数据帧,需要合并并从所有 25 个数据帧中找到重复出现的行,例如,我的数据帧如下所示,

df1
chr start   end     name
1   12334   12334   AAA
1   2342    2342    SAP
2   3456    3456    SOS
3   4537    4537    ABR
df2
chr start   end     name
1   12334   12334   DSF
1   3421    3421    KSF
2   7689    7689    LUF
df3 
chr start   end     name
1   12334   12334   DSF
1   3421    3421    KSF
2   4537    4537    LUF
3   8976    8976    BAR
4   6789    6789    AIN

最后,我的目标是有一个输出数据帧,如下所示,

chr start   end     name    Sample
1   12334   12334   AAA df1
1   12334   12334   AAA df2
1   12334   12334   AAA df3

我可以使用以下解决方案到达那里,通过字典将所有这三个数据框添加到一个更大的数据框 dfs 中

dfs = {'df1':df1,'df2':df2}

然后进一步,

common_tups = set.intersection(*[set(df[['chr', 'start', 'end']].drop_duplicates().apply(tuple, axis=1).values) for df in dfs.values()])
pd.concat([df[df[['chr', 'start', 'end']].apply(tuple, axis=1).isin(common_tups)].assign(Sample=name) for (name, df) in dfs.items()])

这给出了结果数据帧,其中包含来自所有三个数据帧的匹配行,但我有 25 个数据帧,我从目录中调用它们作为列表,如下所示,

path         = 'Fltered_vcfs/' 
files        = os.listdir(path)
results      = [os.path.join(path,i) for i in files if i.startswith('vcf_filtered')]

那么如何在字典中显示列表“结果”并进一步获得所需的输出。 非常感谢任何帮助或建议。

谢谢

回答1

使用 glob 模块,您可以使用

import os
from glob import glob

path = 'Fltered_vcfs' 
f_names = glob(os.path.join(path, 'vcf_filtered*.*')) 

然后,可以使用字典理解创建您的字典

import pandas as pd

 {os.path.splitext(os.path.split(f_name)[1])[0]: pd.read_csv(f_name,sep='\t') for f_name in f_names}

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 如何在一次分配中向熊猫数据框添加多列?(How to add multiple columns to pandas dataframe in one assignment?)
    问题 我是熊猫的新手,试图弄清楚如何同时向熊猫添加多列。 在这里的任何帮助,不胜感激。 理想情况下,我希望一步一步完成此操作,而不是重复多次... import pandas as pd df = {'col_1': [0, 1, 2, 3], 'col_2': [4, 5, 6, 7]} df = pd.DataFrame(df) df[[ 'column_new_1', 'column_new_2','column_new_3']] = [np.nan, 'dogs',3] #thought this would work here... 回答1 我本来希望您的语法也能正常工作。 出现问题是因为当您使用column-list语法( df[[new1, new2]] = ... )创建新列时,pandas要求右侧为DataFrame(请注意,如果DataFrame的列与您要创建的列具有相同的名称)。 您的语法可以很好地将标量值分配给现有的列,并且pandas也很乐意使用单列语法( df[new1] = ... )将标量值分配给新的列。 因此,解决方案是将其转换为几个单列分配,或者为右侧创建一个合适的DataFrame。 这里有几个方法,将工作: import pandas as pd import numpy as np df = pd.DataFrame({ 'col_1':
  • 基于多索引的多个级别有效地连接两个数据帧(Efficiently joining two dataframes based on multiple levels of a multiindex)
    问题 我经常有一个带有大型多索引的数据帧,以及一个带有多索引的辅助数据帧,它是较大索引的子集。 辅助数据框通常是某种查找表。 我经常想将查找表中的列添加到更大的数据框中。 主要的 DataFrame 通常非常大,所以我想有效地做到这一点。 这是一个虚构的例子,我在其中构建了两个数据帧df1和df2 import pandas as pd import numpy as np arrays = [['sun', 'sun', 'sun', 'moon', 'moon', 'moon', 'moon', 'moon'], ['summer', 'winter', 'winter', 'summer', 'summer', 'summer', 'winter', 'winter'], ['one', 'one', 'two', 'one', 'two', 'three', 'one', 'two']] tuples = list(zip(*arrays)) index = pd.MultiIndex.from_tuples(tuples, names=['Body', 'Season','Item']) df1 = pd.DataFrame(np.random.randn(8,2), index=index,columns=['A','B']) index2= pd.MultiIndex
  • 在spark数据帧的同一列上进行多个聚合操作(Multiple Aggregate operations on the same column of a spark dataframe)
    问题 我有三个字符串类型的数组,其中包含以下信息: groupBy数组:包含要对数据进行分组的列的名称。 聚合数组:包含要聚合的列的名称。 操作数组:包含我要执行的聚合操作 我正在尝试使用Spark数据框架来实现这一目标。 Spark数据帧提供了agg(),您可以在其中传递Map [String,String](具有列名和相应的聚合操作)作为输入,但是我想对数据的同一列执行不同的聚合操作。 关于如何实现这一目标的任何建议? 回答1 斯卡拉(Scala) : 例如,您可以映射具有定义的从名称到功能的mapping的功能列表: import org.apache.spark.sql.functions.{col, min, max, mean} import org.apache.spark.sql.Column val df = Seq((1L, 3.0), (1L, 3.0), (2L, -5.0)).toDF("k", "v") val mapping: Map[String, Column => Column] = Map( "min" -> min, "max" -> max, "mean" -> avg) val groupBy = Seq("k") val aggregate = Seq("v") val operations = Seq("min", "max",
  • 通过遍历 Scala 列名列表中的列,从 Spark 数据框中删除多个列(Dropping multiple columns from Spark dataframe by Iterating through the columns from a Scala List of Column names)
    问题 我有一个包含大约 400 列的数据框,我想根据我的要求删除 100 列。 所以我创建了一个包含 100 个列名的 Scala 列表。 然后我想遍历 for 循环以实际删除每个 for 循环迭代中的列。 下面是代码。 final val dropList: List[String] = List("Col1","Col2",...."Col100”) def drpColsfunc(inputDF: DataFrame): DataFrame = { for (i <- 0 to dropList.length - 1) { val returnDF = inputDF.drop(dropList(i)) } return returnDF } val test_df = drpColsfunc(input_dataframe) test_df.show(5) 回答1 如果您只想删除多个命名列而不是通过特定条件选择它们,那么您只需执行以下操作即可: df.drop("colA", "colB", "colC") 回答2 回答: val colsToRemove = Seq("colA", "colB", "colC", etc) val filteredDF = df.select(df.columns .filter(colName => !colsToRemove
  • Python-根据列值将数据框分为多个数据框,并用这些值命名(Python - splitting dataframe into multiple dataframes based on column values and naming them with those values [duplicate])
    问题 这个问题已经在这里有了答案: 将数据帧拆分为多个数据帧(11个答案) 4年前关闭。 我有一个庞大的数据集,列出了在全国不同地区出售的竞争对手产品。 我希望通过使用这些新数据框名称中的列值的迭代过程,根据区域将该数据框分为几个其他区域,以便我可以分别处理每个区域-例如,按价格对每个区域中的信息进行排序以了解每个市场的情况如何。 我给了下面的数据的简化版本: Competitor Region ProductA ProductB Comp1 A £10 £15 Comp1 B £11 £16 Comp1 C £11 £15 Comp2 A £9 £16 Comp2 B £12 £14 Comp2 C £14 £17 Comp3 A £11 £16 Comp3 B £10 £15 Comp3 C £12 £15 我可以使用以下内容创建区域列表: region_list=df['Region'].unique().tolist() 我希望将其用于产生大量数据帧的迭代循环中,例如 df_A : Competitor Region ProductA ProductB Comp1 A £10 £15 Comp2 A £9 £16 Comp3 A £11 £16 我可以使用代码针对每个区域手动执行此操作 df_A=df.loc[df['Region']==A] 但实际情况是
  • 根据另一个数据框中的列删除行[重复](Removing rows based on column in another dataframe [duplicate])
    问题 这个问题在这里已经有了答案: 如何根据基 R 中的另一个数据框对数据框进行子集化2 个回答 4年前关闭。 有没有办法根据另一个数据帧的列从数据帧中删除行? 例如,数据帧 1: Gene CHROM POS REF ALT N_INFORMATIVE Test Beta SE AAA 1 15211 T G 1481 1:15211 -0.0599805 0.112445 LLL 1 762061 T A 1481 1:762061 0.2144100 0.427085 CCC 1 762109 C T 1481 1:762109 0.2847510 0.204255 DDD 1 762273 G A 1481 1:762273 0.0443946 0.119924 数据框 2(仅 1 列): Genes AAA BBB CCC DDD EEE FFF 在这种情况下,我想扫描 Dataframe 1 的第 1 列以查找与 Dataframe 2 的任何匹配,并删除匹配的行。 它们需要完全匹配,结果如下所示: Gene CHROM POS REF ALT N_INFORMATIVE Test Beta SE LLL 1 762061 T A 1481 1:762061 0.2144100 0.427085 我尝试过这种变体,但没有奏效: NewDataframe <-
  • 根据第二个数据框列中的匹配替换数据框列中的值(Replace Values in Dataframe Column based on match in second data frame columns)
    问题 我已经在 Stack Overflow 上看到了六个左右的解决方案,但是,所有解决方案都使用“内”处理单个数据帧内的匹配项。 我需要一个跨越多个数据帧的解决方案: 我在数据框 1 的列中有值 DF1$A : "1, 2, 1, 3, 2, 6, 4, 5, 8, 8, 2, 7, 4, 等等" 我有第二个数据框,其中包含这些代码的“关键” DF2$A : "1, 2, 3, 4, 5, 6, 7, 8, 9, 10" DF2$B :“馅饼、比萨、汉堡包等” 如何更改DF1$A中的值以匹配DF2$B中的值? 回答1 您可以使用match作为指向df2$B特定位置的指针来执行此操作: # make some toy data set.seed(1) df1 <- data.frame(A = sample(seq(3), 10, replace = TRUE)) df2 <- data.frame(A = seq(3), B = c("pizza", "hot dog", "hamburger"), stringsAsFactors = FALSE) df1$B <- df2$B[match(df1$A, df2$A)] 结果: > df1 A B 1 3 hamburger 2 1 pizza 3 2 hot dog 4 1 pizza 5 1 pizza 6 2 hot
  • 熊猫中merge()和concat()之间的差异(Difference(s) between merge() and concat() in pandas)
    问题 pd.DataFrame.merge()和pd.concat()之间的本质区别是什么? 到目前为止,这是我发现的结果,请评论我的理解是多么完整和准确: .merge()只能使用列(加上行索引),并且在语义上适合于数据库样式的操作。 .concat()可以与任一轴一起使用,仅使用索引,并提供添加分层索引的选项。 附带地,这允许以下冗余:两者都可以使用行索引来组合两个数据帧。 pd.DataFrame.join()仅仅是提供了一个速记的用例的一个子集.merge() (Pandas擅长解决数据分析中的各种用例。探索文档以找出执行特定任务的最佳方法可能有些艰巨。) 回答1 一个非常高的差异是, merge()用于基于公共列的值组合两个(或多个)数据帧(也可以使用索引,使用left_index=True和/或right_index=True ),以及concat()用于将一个(或多个)数据帧一个接一个地附加在另一个数据帧(或横向放置,具体取决于axis选项设置为0还是1)上。 join()用于根据索引合并2个数据帧; 代替使用带有选项left_index=True merge() ,我们可以使用join() 。 例如: df1 = pd.DataFrame({'Key': ['b', 'b', 'a', 'c', 'a', 'a', 'b'], 'data1': range(7)})
  • PySpark将类型为“映射”的列转换为数据框中的多个列(PySpark converting a column of type 'map' to multiple columns in a dataframe)
    问题 输入 我有一个形式为类型的map的Parameters列: >>> from pyspark.sql import SQLContext >>> sqlContext = SQLContext(sc) >>> d = [{'Parameters': {'foo': '1', 'bar': '2', 'baz': 'aaa'}}] >>> df = sqlContext.createDataFrame(d) >>> df.collect() [Row(Parameters={'foo': '1', 'bar': '2', 'baz': 'aaa'})] 输出 我想在pyspark中重塑它,以便所有键( foo , bar等)都是列,即: [Row(foo='1', bar='2', baz='aaa')] 使用withColumn工作原理是: (df .withColumn('foo', df.Parameters['foo']) .withColumn('bar', df.Parameters['bar']) .withColumn('baz', df.Parameters['baz']) .drop('Parameters') ).collect() 但是我需要一个解决方案,因为我有很多列名称,所以没有明确提及列名称。 架构图 >>> df.printSchema()
  • 在 Pandas 中将数据帧子集化为多个数据帧(Subsetting Data Frame into Multiple Data Frames in Pandas)
    问题 我有一个 Pandas 数据框,它有 51034 行和 10 列。 我想根据包含要切片的行的列表将此数据帧切片为 158 个较小的数据帧。 如何将 Pandas 数据帧切片成更小的数据帧? 例如,如果我有一个 10 行 4 列的数据框: A B C D 0 1 2 3 4 1 5 6 7 8 2 9 10 11 12 3 13 14 15 16 4 17 18 19 20 5 21 22 23 24 6 25 26 27 28 7 29 30 31 32 8 33 34 35 36 9 37 38 39 40 此示例数据框将每 2 行切片以创建 5 个新的较小数据框: DataFrame1: A B C D 0 1 2 3 4 1 5 6 7 8 DataFrame2: A B C D 0 9 10 11 12 1 13 14 15 16 DataFrame3: A B C D 0 17 18 19 20 1 21 22 23 24 DataFrame4: A B C D 0 25 26 27 28 1 29 30 31 32 DataFrame5: A B C D 0 33 34 35 36 1 37 38 39 40 我不确定如何使用切片较大的数据帧来创建较小的数据帧。 关于如何实现这一目标的任何建议? 谢谢你。 罗德里戈 回答1 您可以将 groupby
  • 根据匹配值使用来自另一个数据帧的值更新一个数据帧中的列(updating column in one dataframe with value from another dataframe based on matching values)
    问题 我有一个数据框“z” letter color 1 a 0 2 e 0 3 b 0 4 b 0 5 d 0 6 d 0 7 a 0 8 b 0 9 c 0 10 d 0 11 c 0 12 c 0 13 c 0 14 c 0 15 e 0 16 e 0 17 a 0 18 d 0 19 e 0 20 b 0 和另一个数据框“y” letter color 1 a red 2 b blue 3 c green 当 z 中的字母与 y 中的字母匹配时,我想将 y 中的颜色附加到 z 中相应的颜色字段中,但我不想从 z 中删除任何值。 如果没有匹配,z$color 应该保持不变。 我在 z$color 中使用“0”作为占位符,这可以是文本。 我一直在尝试循环、match() 命令和带有 %in% 的语句,但我并没有完全达到我想要的结果。 有任何想法吗? 这是我用于数据框的代码 set.seed(3) z=data.frame(sample(c("a","b","c","d","e"),20,replace=T)) names(z)="letter" z$color=rep(0,dim(z)[1]) z y1=c("a","b","c") y2=c("red","blue","green") y=data.frame(cbind(y1,y2)) names(y)=c("letter"
  • 如何根据多行中的值对数据框的列进行排序?(How do I sort a dataframe's columns based on the values in multiple rows?)
    问题 例如, df = pd.DataFrame({'x':[1,1,1,2,3,3], 'y':['a','a','c','b','b','b']}) ct = pd.crosstab(df.x, df.y) ct y a b c x 1 2 0 1 2 0 1 0 3 0 2 0 如何根据 row1、row2 和 row3 中的值(按优先级顺序)对 ct 的列进行排序? 我尝试了以下方法,但都不起作用 ct.sort_values([1, 2, 3], axis=1) ct.sort_values(['1','2','3'], axis=1) 回答1 目前无法通过直接调用sort_values来完成此操作。 有一个关于它的开放错误报告。 您仍然可以通过转置,按列排序,然后再次转置来做得不太好: >>> ct.T.sort_values([1, 2, 3]).T y b c a x 1 0 1 2 2 1 0 0 3 2 0 0 回答2 这应该按照 a>b>c 的顺序对它们进行排序: df = pd.DataFrame({'x':[1,1,1,2,3,3], 'y':['a','a','c','b','b','b']}) ct = pd.crosstab(df.x, df.y) y a b c x 1 2 0 1 2 0 1 0 3 0 2 0 sorted_df = pd
  • 重命名多个数据框中的列,R(Rename columns in multiple dataframes, R)
    问题 我试图重命名多个data.frame的列。 举个例子,假设我有一个data.frame的列表s dfA , dfB和dfC 。 我编写了一个changeNames函数来changeNames地设置名称,然后如下使用lapply : dfs <- list(dfA, dfB, dfC) ChangeNames <- function(x) { names(x) <- c("A", "B", "C" ) } lapply(dfs, ChangeNames) 但是,这不符合预期。 似乎我没有将新名称分配给data.frame ,而是仅创建了新名称。 我在这里做错了什么? 先感谢您! 回答1 这里有两件事: 1)您应该从函数中返回想要的值。 否则,将返回最后一个值。 在您的情况下,这就是names(x) 。 因此,您应该添加return(x)或简单地添加x作为最后一行。 因此,您的函数将如下所示: ChangeNames <- function(x) { names(x) <- c("A", "B", "C" ) return(x) } 2) lapply不会通过引用修改您的输入对象。 它适用于副本。 因此,您必须将结果分配回去。 或者另一种替代方法是使用for-loops而不是lapply : # option 1 dfs <- lapply(dfs, ChangeNames) #
  • 如何将单独的Pan​​das DataFrame绘制为子图?(How can I plot separate Pandas DataFrames as subplots?)
    问题 我有一些Pandas DataFrame共享相同的价值规模,但具有不同的列和索引。 当调用df.plot() ,我得到了单独的绘图图像。 我真正想要的是将它们与子图放置在同一块图上,但是不幸的是,我未能提出解决方案,并且希望获得一些帮助。 回答1 您可以使用matplotlib手动创建子图,然后使用ax关键字在特定子图上绘制数据框。 例如,对于4个子图(2x2): import matplotlib.pyplot as plt fig, axes = plt.subplots(nrows=2, ncols=2) df1.plot(ax=axes[0,0]) df2.plot(ax=axes[0,1]) ... 这里axes是一个数组,其中包含不同的子图轴,您可以仅通过索引axes来访问一个axes 。 如果要共享x轴,则可以将sharex=True提供给plt.subplots 。 回答2 您可以看到例如在说明joris答案的文档中。 同样从文档中,您还可以在pandas plot函数内设置subplots=True和layout=(,) : df.plot(subplots=True, layout=(1,2)) 您还可以使用fig.add_subplot()来获取子图网格参数,例如221、222、223、224等,如此处的文章所述。
  • 用dict重新映射pandas列中的值(Remap values in pandas column with a dict)
    问题 我有一本字典,看起来像这样: di = {1: "A", 2: "B"} 我想将其应用于类似于以下内容的数据框的“ col1”列: col1 col2 0 w a 1 1 2 2 2 NaN 要得到: col1 col2 0 w a 1 A 2 2 B NaN 我怎样才能最好地做到这一点? 出于某种原因,与此相关的谷歌搜索术语仅向我显示了有关如何根据字典创建列的链接,反之亦然:-/ 回答1 您可以使用.replace。 例如: >>> df = pd.DataFrame({'col2': {0: 'a', 1: 2, 2: np.nan}, 'col1': {0: 'w', 1: 1, 2: 2}}) >>> di = {1: "A", 2: "B"} >>> df col1 col2 0 w a 1 1 2 2 2 NaN >>> df.replace({"col1": di}) col1 col2 0 w a 1 A 2 2 B NaN 或直接在Series上,即df["col1"].replace(di, inplace=True) 。 回答2 map可以比replace快得多 如果您的字典中有多个键,那么使用map会比replace快得多。 此方法有两种版本,具体取决于字典是否详尽地映射所有可能的值(以及是否要让不匹配项保留其值或将其转换为NaN): 详尽的映射
  • Python:熊猫合并了多个数据框(Python: pandas merge multiple dataframes)
    问题 我有不同的数据框,需要根据日期列将它们合并在一起。 如果我只有两个数据帧,则可以使用df1.merge(df2, on='date')来处理三个数据帧,我可以使用df1.merge(df2.merge(df3, on='date'), on='date') ,但是对多个数据帧执行此操作变得非常复杂且难以读取。 所有数据框的公共date只有一列,但它们的行数和列数都不相同,而我只需要每个日期对于每个数据框都是公用的那些行。 因此,我试图编写一个递归函数,该函数返回一个包含所有数据的数据框,但是它不起作用。 那我应该如何合并多个数据框呢? 我尝试了不同的方式,并遇到错误,例如out of range , keyerror 0/1/2/3 , can not merge DataFrame with instance of type <class 'NoneType'> 。 这是我写的脚本: dfs = [df1, df2, df3] # list of dataframes def mergefiles(dfs, countfiles, i=0): if i == (countfiles - 2): # it gets to the second to last and merges it with the last return dfm = dfs[i].merge
  • 将函数应用于带有两个参数的 Pandas 数据框中的列(Apply function to column in pandas dataframe that takes two arguments)
    问题 说我有一个特定的映射: mapping = { 'cat': 'purrfect', 'dog': 'too much work', 'fish': 'meh' } 和一个dataframe : animal name description 0 cat sparkles NaN 1 dog rufus NaN 2 fish mr. blub NaN 我想使用animal列和mapping dict作为输入以编程方式填写description列: def describe_pet(animal,mapping): return mapping[animal] 当我尝试使用 pandas apply()函数时: df['description'].apply(describe_pet,args=(df['animal'],mapping)) 我收到以下错误: TypeError: describe_pet() takes exactly 2 arguments (3 given) 似乎使用apply()向函数传递一个参数是微不足道的。 我怎么能用两个参数来做呢? 回答1 建议的答案解决了您的具体问题,但对于更通用的情况: args参数用于除列之外的参数: args :元组位置参数除了数组/系列之外还要传递给函数 pandas.DataFrame.apply 回答2
  • 根据字典重命名PANDAS中的列(Rename columns in PANDAS based on dictionary)
    问题 我有一个数据框,我想根据另一个打算用作字典的数据框重命名这些列。 例如,我拥有的第一个数据框是: AAA BBB CCC DDD index 1 1 2 3 4 2 5 6 7 8 并作为第二个数据框,我想用作字典: val1 val2 index 1 AAA A7 2 BBB B0 3 CCC C3 4 DDD D1 我想得到的结果如下: A7 B0 C3 D1 index 1 1 2 3 4 2 5 6 7 8 最初,我想将第一个数据框重塑为长格式,然后与字典数据框合并,然后重塑为宽格式。 但是我认为这效率很低,因此我想使用一种更有效的方法(如果存在)。 非常感谢您的帮助。 回答1 我认为您可以先从df2创建dictionary ,然后通过to_series从df1的列创建Series ,然后使用dictionary进行映射: print df1 AAA BBB CCC DDD index 1 1 2 3 4 2 5 6 7 8 print df2 val1 val2 index 1 AAA A7 2 BBB B0 3 CCC C3 4 DDD D1 d = df2.set_index('val1').to_dict() print d['val2'] {'AAA': 'A7', 'BBB': 'B0', 'CCC': 'C3', 'DDD': 'D1'} df1
  • 基于熊猫中的多个键合并两个DataFrame(Merge two DataFrames based on multiple keys in pandas)
    问题 熊猫(或另一个模块)是否具有任何功能来支持基于多个键的两个表的合并(或联接)? 例如,我有两个表(DataFrames) a和b : >>> a A B value1 1 1 23 1 2 34 2 1 2342 2 2 333 >>> b A B value2 1 1 0.10 1 2 0.20 2 1 0.13 2 2 0.33 理想的结果是: A B value1 value2 1 1 23 0.10 1 2 34 0.20 2 1 2342 0.13 2 2 333 0.33 回答1 要通过多个键合并,您只需要将列表中的键传递给pd.merge: >>> pd.merge(a, b, on=['A', 'B']) A B value1 value2 0 1 1 23 0.10 1 1 2 34 0.20 2 2 1 2342 0.13 3 2 2 333 0.33 实际上, pd.merge的默认pd.merge是使用两个DataFrame的列标签的交集,因此pd.merge(a, b)在这种情况下同样可以正常工作。 回答2 根据最新的熊猫文档, on参数接受标签或字段名称列表,并且必须在两个数据框中都找到它们。 这是一个使用的MWE: a = pd.DataFrame({'A':['0', '0', '1','1'],'B':['0', '1', '0','1']
  • 熊猫数据框中值的映射范围(Mapping ranges of values in pandas dataframe [duplicate])
    问题 这个问题已经在这里有了答案: 如何将数字数据映射到Pandas数据框中的类别/箱(1个答案) 去年关闭。 抱歉,是否曾有人问过这个问题,但我进行了广泛调查,但没有结果。 import pandas as pd import numpy as np df = pd.DataFrame(data = np.random.randint(1,10,10),columns=['a']) a 0 7 1 8 2 8 3 3 4 1 5 1 6 2 7 8 8 6 9 6 我想创建一个新列b , a根据一些规则映射b多个值,例如a = [1,2,3]为1,a = [4,5,6,7]为2,a = [8,9,10]是3。一对一映射对我很清楚,但是如果我想按值列表或范围进行映射怎么办? 我坚持这些方针... df['b'] = df['a'].map({[1,2,3]:1,range(4,7):2,[8,9,10]:3}) 回答1 有几种选择。 通过pd.cut熊猫/通过np.digitize NumPy 您可以构造边界列表,然后使用专家库功能。 @EdChum的解决方案以及此答案中对此进行了描述。 通过np.select NumPy df = pd.DataFrame(data=np.random.randint(1,10,10), columns=['a']) criteria = [df