在两列之间分别对每一行进行排序
Sort each row individually between two columns
我有以下 pandas 数据框:
column_01 column_02 value
ccc aaa 1
bbb ddd 34
ddd aaa 98
我需要重新组织数据框,使 column_01
包含 column_01
和 column_02
之间按字母顺序排在第一位的值。上述示例的输出为:
column_01 column_02 value
aaa ccc 1
bbb ddd 34
aaa ddd 98
我显然可以通过一次一行地遍历数据帧来做到这一点,比较 column_01
和 column_02
以查看哪个按字母顺序排在第一位,并在必要时交换它们。唯一的问题是数据框很大(超过 100 万 行),所以这不是一个非常有效的方法。
有没有一种方法可以在不单独遍历每一行的情况下做到这一点?
您可以使用:
df[['column_01','column_02']] =
df[['column_01','column_02']].apply(lambda x: sorted(x.values), axis=1)
print (df)
column_01 column_02 value
0 aaa ccc 1
1 bbb ddd 34
2 aaa ddd 98
另一种解决方案:
df[['column_01','column_02']] = pd.DataFrame(np.sort(df[['column_01','column_02']].values),
index=df.index, columns=['column_01','column_02'])
仅适用于 numpy 数组:
df[['column_01','column_02']] = np.sort(df[['column_01','column_02']].values)
print (df)
column_01 column_02 value
0 aaa ccc 1
1 bbb ddd 34
2 aaa ddd 98
第二种解决方案更快,因为apply
使用循环:
df = pd.concat([df]*1000).reset_index(drop=True)
In [177]: %timeit df[['column_01','column_02']] = pd.DataFrame(np.sort(df[['column_01','column_02']].values), index=df.index, columns=['column_01','column_02'])
1000 loops, best of 3: 1.36 ms per loop
In [182]: %timeit df[['column_01','column_02']] = np.sort(df[['column_01','column_02']].values)
1000 loops, best of 3: 1.54 ms per loop
In [178]: %timeit df[['column_01','column_02']] = (df[['column_01','column_02']].apply(lambda x: sorted(x.values), axis=1))
1 loop, best of 3: 291 ms per loop
我有以下 pandas 数据框:
column_01 column_02 value
ccc aaa 1
bbb ddd 34
ddd aaa 98
我需要重新组织数据框,使 column_01
包含 column_01
和 column_02
之间按字母顺序排在第一位的值。上述示例的输出为:
column_01 column_02 value
aaa ccc 1
bbb ddd 34
aaa ddd 98
我显然可以通过一次一行地遍历数据帧来做到这一点,比较 column_01
和 column_02
以查看哪个按字母顺序排在第一位,并在必要时交换它们。唯一的问题是数据框很大(超过 100 万 行),所以这不是一个非常有效的方法。
有没有一种方法可以在不单独遍历每一行的情况下做到这一点?
您可以使用:
df[['column_01','column_02']] =
df[['column_01','column_02']].apply(lambda x: sorted(x.values), axis=1)
print (df)
column_01 column_02 value
0 aaa ccc 1
1 bbb ddd 34
2 aaa ddd 98
另一种解决方案:
df[['column_01','column_02']] = pd.DataFrame(np.sort(df[['column_01','column_02']].values),
index=df.index, columns=['column_01','column_02'])
仅适用于 numpy 数组:
df[['column_01','column_02']] = np.sort(df[['column_01','column_02']].values)
print (df)
column_01 column_02 value
0 aaa ccc 1
1 bbb ddd 34
2 aaa ddd 98
第二种解决方案更快,因为apply
使用循环:
df = pd.concat([df]*1000).reset_index(drop=True)
In [177]: %timeit df[['column_01','column_02']] = pd.DataFrame(np.sort(df[['column_01','column_02']].values), index=df.index, columns=['column_01','column_02'])
1000 loops, best of 3: 1.36 ms per loop
In [182]: %timeit df[['column_01','column_02']] = np.sort(df[['column_01','column_02']].values)
1000 loops, best of 3: 1.54 ms per loop
In [178]: %timeit df[['column_01','column_02']] = (df[['column_01','column_02']].apply(lambda x: sorted(x.values), axis=1))
1 loop, best of 3: 291 ms per loop