【问题标题】:filter specific values in dataframe with unique prefix in column name (e.g. 'UniqueID_commonsuffix')使用列名中的唯一前缀过滤数据框中的特定值(例如“UniqueID_commonsuffix”)
【发布时间】:2021-01-05 17:07:25
【问题描述】:

我有一个包含超过 300 个唯一样本的数据框,每个样本有 2 列类似信息,我想在每个样本的其中一列中过滤 34 个特定值。我已包含数据的屏幕截图以帮助可视化此问题。我基本上想生成一个新的数据框,其中仅包含我指定的 34 个值中的信息。如果这个问题难以理解,我很抱歉,我希望截图有助于更好地定义问题。

在此屏幕截图中,每个带有“sampleID_r.variant”的列都需要针对我在单独数据框中的特定值进行过滤。我感兴趣的只有 34 个。这样,我想将相应的值连同它一起存储在“sampleID_reads”列的左侧,就像字典一样。如果有人可以提供帮助,我将不胜感激。非常感谢。

编辑: 原始数据框格式如下:

sampleID_reads sampleID_r.variant
1 r.79_80ins79+1_79+76
64 r.79_80ins79+10857_79+10938
53 r.79_80ins80-13725_80-13587
72 r.79_80ins80-5488_80-5435
16 r.79_80ins79+2861_79+2900

34 个样本的格式如下:

r_dot
r.646_729del
r.-19_-18ins-19+428_-19+535
r.-25_-20del
r.4186_4188del
r.5333_5406del
...so on and so forth

【问题讨论】:

  • 请不要发布图片。而是将所有内容粘贴为文本。另外,请提供具有预期输出的示例输入数据。
  • “34 个特定值”是如何存储的,它们长什么样子?
  • @It_is_Chris 我也附上这一点,对造成的混乱表示歉意。编辑我的问题以更好地解决问题。
  • @srajpara 是 34 个样本,等于 sampleID_r.variant 中的完整字符串或只是字符串的一部分。 r_dot 中的值都不匹配 sampleID_r.variant 中的值此外,每个 ID 的“读取”和“变体”是否总是彼此相邻,或者您的列可以随机排列吗?
  • @It_is_Chris 啊,所以我碰巧复制了不匹配的 r.variants 列表的顶部,但在整个列中,肯定有匹配来自 34 个样本的确切字符串。对于每个样本,每列的顺序完全相同(例如,sample1_reads (col1) sample1_r.variant (col2)、sample2_reads (col3)、sample2_r.variant (col4))。我希望澄清它!

标签: python pandas dataframe filtering data-munging


【解决方案1】:

这是一些示例数据

d = {'sample1_reads': [1, 64, 53, 72, 16],
    'sample1_r.variant': ['r.79_80ins79+1_79+76', 'r.79_80ins79+10857_79+10938', 
                         'r.79_80ins80-13725_80-13587', 'r.79_80ins80-5488_80-5435', 'r.79_80ins79+2861_79+2900'], 
    'sample2_reads': [0, 3, 6, 9, 11], 
    'sample2_r.variant': ['r.5333_5406del', 'r.4186_4188del', 'r.5333_54106del', 'r.2345_2345fad', 'r.65456_w56sjfy']}
df = pd.DataFrame(d)
rdot = pd.DataFrame(['r.79_80ins79+1_79+76', 'r.646_729del', 'r.5333_5406del', 'r.79_80ins80-5488_80-5435', 'r.79_80ins79+2861_79+2900'], columns=['r_dot'])

如果您只想根据第二帧过滤第一帧,那么您可以执行以下操作

# reshape your current data frame 
new_df = pd.DataFrame(df.values.reshape((-1,2)), columns=['reads', 'variant'])
# use boolean indexing to filter your new data frame
df_f = new_df[new_df['variant'].isin(rdot['r_dot'])]

  reads                    variant
0     1       r.79_80ins79+1_79+76
1     0             r.5333_5406del
6    72  r.79_80ins80-5488_80-5435
8    16  r.79_80ins79+2861_79+2900

【讨论】:

  • 这太棒了!!非常感谢!我将使用它并稍微操作它以遍历每个存储单个样本信息的文件。我最初在屏幕截图中看到的列中生成了一个包含每个 sampleID 信息(读取、变体)的大文件。由每个单独的文件执行此操作似乎更有意义,然后将过滤后的值存储在您在上面发布的新数据框中。非常感谢您的帮助和耐心。我真的很感激!
  • @srajpara 根本不是问题。祝你好运,编码愉快。
猜你喜欢
  • 2019-02-04
  • 1970-01-01
  • 1970-01-01
  • 2022-10-30
  • 1970-01-01
  • 2022-12-06
  • 2020-11-27
  • 2019-02-10
  • 1970-01-01
相关资源
最近更新 更多