重新排列错位的列

Zhen Sun

我想问一个数据清理问题,我认为python可能更有效。数据中有很多列放错了位置,我必须基于某些列使用某些特征才能将它们放置在正确的位置。以下是Stata代码的示例:

forvalues i = 20(-1)2{
local j = `i' + 25
local k = `j' - 2
replace v`j' = v`k' if substr(v23, 1, 4) == "1980"
} 

也就是说,v25 - v43如果列中的观察值v23以“ 1980”开头,则将列中的内容向后移动2 否则,列是正确的。

任何帮助表示赞赏。

埃德·楚姆

下面是一个简化的示例以显示其工作原理:

In [65]:
# create some dummy data
import pandas as pd
import io
pd.set_option('display.notebook_repr_html', False)
temp = """v21 v22 v23  v24  v25  v28
1 1 19801923 1 5 8
1 1 20003 1 5 8
1 1 9129389 1 5 8
1 1 1980 1 5 8
1 1 1923 2 5 8
1 1 9128983 1 5 8"""
df = pd.read_csv(io.StringIO(temp),sep='\s+')

df
Out[65]:
   v21  v22       v23  v24  v25  v28
0    1    1  19801923    1    5    8
1    1    1     20003    1    5    8
2    1    1   9129389    1    5    8
3    1    1      1980    1    5    8
4    1    1      1923    2    5    8
5    1    1   9128983    1    5    8

In [68]:
# I have to convert my data to a string in order for this to work, it may not be necessary for you in which case the following commented out line would work for you:
#df.v23.str.startswith('1980')
df.v23.astype(str).str.startswith('1980')
Out[68]:
0     True
1    False
2    False
3     True
4    False
5    False
Name: v23, dtype: bool
In [70]:
# now we can call shift by 2 along the column axis to assign the values back

df.loc[df.v23.astype(str).str.startswith('1980'),['v25','v28']] = df.shift(2,axis=1)
df
Out[70]:
   v21  v22       v23  v24       v25  v28
0    1    1  19801923    1  19801923    1
1    1    1     20003    1         5    8
2    1    1   9129389    1         5    8
3    1    1      1980    1      1980    1
4    1    1      1923    2         5    8
5    1    1   9128983    1         5    8

因此,您需要做的是预先定义列列表:

In [72]:

target_cols = ['v' + str(x) for x in range(25,44)]
print(target_cols)
['v25', 'v26', 'v27', 'v28', 'v29', 'v30', 'v31', 'v32', 'v33', 'v34', 'v35', 'v36', 'v37', 'v38', 'v39', 'v40', 'v41', 'v42', 'v43']

现在,将其替换为我的方法,我相信它应该可以工作:

df.loc[df.v23.astype(str).str.startswith('1980'),target_cols] = df.shift(2,axis=1)

shift了解参数

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

重新排列 CSV 列

来自分类Dev

在移动设备上重新排列列

来自分类Dev

如何重新排列QTableView的列顺序

来自分类Dev

熊猫重新排列DataFrame列?

来自分类Dev

在PySpark中重新排列列

来自分类Dev

分组后重新排列Telerik列

来自分类Dev

按列名重新排列列的顺序

来自分类Dev

使用awk重新排列列

来自分类Dev

在LINUX中重新排列以:分隔的列

来自分类Dev

通过匹配列重新排列数据

来自分类Dev

在SQL中重新排列列的单词

来自分类Dev

在Python中重新排列缩进之后再排列列

来自分类Dev

如果一次出现列值,则MySQL重新排列/重新排列行位置

来自分类Dev

重新排列数组

来自分类Dev

重新排列读取

来自分类Dev

重新排列数组

来自分类Dev

重新排列链表

来自分类Dev

重新排列数组

来自分类Dev

性能问题-根据列标题重新排列列

来自分类Dev

将文件重新排列为三列

来自分类Dev

需要重新排列和求和solaris命令中的列

来自分类Dev

重新排列列值小于x的数据帧的行

来自分类Dev

重新排列矩阵:折叠列以除去NA

来自分类Dev

R:根据排名重新排列数据框的列

来自分类Dev

在移动视图中重新排列列顺序

来自分类Dev

熊猫将数据重新排列为相同值的列

来自分类Dev

再次重新排列数据框中的列

来自分类Dev

在pandas数据框中基于顺序的列重新排列

来自分类Dev

R Studio-分组后重新排列列