pandas DataFrame的单列中的多个值

时间:2014-11-07 02:04:42

标签: python pandas

我有一些数据,我将从XML解析为pandas DataFrame。 XML数据大致如下所示:

<tracks>
  <track name="trackname1" variants="1,2,3,4,5">
    <variant var="1,2,3">
      <leg time="21:23" route_id="5" stop_id="103" serial="1"/>
      <leg time="21:26" route_id="5" stop_id="17" serial="2"/>
      <leg time="21:30" route_id="5" stop_id="38" serial="3"/>
      <leg time="20:57" route_id="8" stop_id="101" serial="1"/>
      <leg time="21:01" route_id="8" stop_id="59" serial="2"/>
      ...
    </variant>
    <variant var="4,5">
      ... more leg elements
    </variant>
  </track>
  <track name="trackname2" variants="1,2,3,4,5,6,7">
    <variant var="1">
      ... more leg elements
    </variant>
    <variant var="2,3,4,5,7">
      ... more leg elements
    </variant>
  </track>
</tracks>

我将此导入到pandas中是因为我需要能够将此数据与其他DataFrame相关联,我需要能够查询以下内容:&#34;获取变量1的所有内容以获取route_id 5& #34;

我试图弄清楚如何在pandas DataFrame中执行此操作。我应该制作一个看起来像这样的DataFrame:

track_name     variants  time     route_id  stop_id  serial
"trackname1"   "1,2,3"   "21:23"  "5"       "103"    "1"
"trackname1"   "1,2,3"   "21:26"  "5"       "17"     "2"
...
"trackname1"   "4,5"     "21:20"  "5"       "103"    "1"
...
"trackname2"   "1"       "20:59"  "3"       "45"     "1"
... you get the point

如果这是要走的路,我将如何(有效地)提取例如#34; route_id 5&#34;上的变体3的所有行?请注意,这应该为我提供变量列列表中包含3的所有行,而不仅仅是具有&#34; 3&#34;在变体列中。

是否有一种不同的构建DataFrame的方法可以使这更容易?我应该使用熊猫以外的东西吗?

1 个答案:

答案 0 :(得分:3)

假设您有足够的内存,如果您的DataFrame每行保留一个变体,则您的任务将更容易完成:

track_name     variants  time     route_id  stop_id  serial
"trackname1"   1         "21:23"         5      103       1
"trackname1"   2         "21:23"         5      103       1
"trackname1"   3         "21:23"         5      103       1
"trackname1"   1         "21:26"         5       17       2
"trackname1"   2         "21:26"         5       17       2
"trackname1"   3         "21:26"         5       17       2
...
"trackname1"   4         "21:20"         5      103       1
"trackname1"   5         "21:20"         5      103       1
...
"trackname2"   1         "20:59"         3       45       1

然后你可以在route_id 5上用

找到“变体3的所有行”
df.loc[(df['variants']==3) & (df['route_id']==5)]

如果将多个变体打包到一行,例如

"trackname1"   "1,2,3"   "21:23"  "5"       "103"    "1"

然后你可以使用

找到这样的行
df.loc[(df['variants'].str.contains("3")) & (df['route_id']=="5")]

假设变体总是单个数字。如果还有两位数的变体,如“13”或“30”,那么您需要将更复杂的正则表达式模式传递给str.contains

或者,您可以使用apply在逗号上拆分每个变体:

df['variants'].apply(lambda x: "3" in x.split(','))

但是这非常无用,因为你现在要调用Python函数 每行一次,并进行字符串拆分和测试成员资格 列表与矢量化整数比较相比较。

因此,为了避免可能复杂的正则表达式或对apply的相对较慢的调用,我认为最好的办法是构建每行一个整数变量的DataFrame。