如果您对Pandas:根据特定列的值计数选择行感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于Pandas:根据特定列的值计数选择行的详细内容,我们还将为您解答pandas根
如果您对Pandas:根据特定列的值计数选择行感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于Pandas:根据特定列的值计数选择行的详细内容,我们还将为您解答pandas 根据某列的值筛选的相关问题,并且为您提供关于linux 中实现根据特定列的重复项提取数据、MYSQL根据特定列选择多个列、Pandas / Python:根据另一列中的值设置一列的值、pandas 数据框中 2 列的值计数的有价值信息。
本文目录一览:- Pandas:根据特定列的值计数选择行(pandas 根据某列的值筛选)
- linux 中实现根据特定列的重复项提取数据
- MYSQL根据特定列选择多个列
- Pandas / Python:根据另一列中的值设置一列的值
- pandas 数据框中 2 列的值计数
Pandas:根据特定列的值计数选择行(pandas 根据某列的值筛选)
从pandas数据框中选择所有行的最简单方法是什么?谁的符号在整个表中恰好出现两次?例如,在下表中,我想选择在[‘b’,’e’]中带有sym的所有行,因为这些符号的value_counts等于2。
df=pd.DataFrame({''sym'':[''a'', ''b'', ''b'', ''c'', ''d'',''d'',''d'',''e'',''e''],''price'':np.random.randn(9)}) price sym 0 -0.0129 a 1 -1.2940 b 2 1.8423 b 3 -0.7160 c 4 -2.3216 d 5 -0.0120 d 6 -0.5914 d 7 0.6280 e 8 0.5361 edf.sym.value_counts()Out[237]: d 3e 2b 2c 1a 1
答案1
小编典典我认为您可以groupby
按列sym
和filter
值使用length == 2
:
print df.groupby("sym").filter(lambda x: len(x) == 2) price sym1 0.400157 b2 0.978738 b7 -0.151357 e8 -0.103219 e
第二个解决方案使用isin
与布尔索引:
s = df.sym.value_counts()print s[s == 2].indexIndex([u''e'', u''b''], dtype=''object'')print df[df.sym.isin(s[s == 2].index)] price sym1 0.400157 b2 0.978738 b7 -0.151357 e8 -0.103219 e
并用最快的解决方案transform
和booleanindexing
:
print (df[df.groupby("sym")["sym"].transform(''size'') == 2]) price sym1 -1.2940 b2 1.8423 b7 0.6280 e8 0.5361 e
linux 中实现根据特定列的重复项提取数据
001、
(base) root@PC1:/home/test3# ls a.txt (base) root@PC1:/home/test3# cat a.txt ## 测试数据 1 aa 2 bb 3 aa 4 cc 5 dd 6 cc 7 kk 8 aa 9 kk ## 根据第二列的重复项筛选数据 (base) root@PC1:/home/test3# cut -f 2 a.txt | sort | uniq -d | while read i; do awk -v a=$i '$2 == a' a.txt >> result; done (base) root@PC1:/home/test3# ls a.txt result (base) root@PC1:/home/test3# cat result ## 结果文件 1 aa 3 aa 8 aa 4 cc 6 cc 7 kk 9 kk
002、R语言实现
dir() dat <- read.table("a.txt") ## 测试数据 dat id <- unique(dat[,2][duplicated(dat[,2])]) ## 提取重复id id dat[dat$V2 %in% id,] ## 提取重复数据
003、python实现
(base) root@PC1:/home/test3# ls a.txt test.py (base) root@PC1:/home/test3# cat a.txt ## 测试数据 1 aa 2 bb 3 aa 4 cc 5 dd 6 cc 7 kk 8 aa 9 kk (base) root@PC1:/home/test3# cat test.py ## 测试程序 #!/usr/bin/python in_file = open("a.txt", "r") out_file = open("result.txt", "w") lines = in_file.readlines() list1 = [] for i in lines: i = i.strip().split() list1.append(i[-1]) set1 = set() for i in list1: if list1.count(i) > 1: set1.add(i) for i in lines: i = i.strip().split() for j in set1: if i[-1] == j: out_file.write("\t".join(i) + "\n") in_file.close() out_file.close() (base) root@PC1:/home/test3# python test.py ## 执行程序 (base) root@PC1:/home/test3# ls a.txt result.txt test.py (base) root@PC1:/home/test3# cat result.txt ## 结果文件 1 aa 3 aa 4 cc 6 cc 7 kk 8 aa 9 kk
MYSQL根据特定列选择多个列
我想做一个SELECT请求,根据PLATFORM值,设法获得2列VALUE(DESKTOP& MOBILE).
这是一个示例表:
+----+---------+------+----------+-------+
| ID | PROJECT | NAME | PLATFORM | VALUE |
+----+---------+------+----------+-------+
| 1 | 1 | Foo | desktop | 1 |
| 2 | 1 | Foo | mobile | 42 |
| 3 | 1 | Bar | desktop | 3 |
| 4 | 1 | Bar | mobile | 10 |
| 5 | 2 | Foo | desktop | 2 |
| 6 | 2 | Bar | mobile | 9 |
+----+---------+------+----------+-------+
期望的输出:
+---------+------+---------+--------+
| PROJECT | NAME | DESKTOP | MOBILE |
+---------+------+---------+--------+
| 1 | Foo | 1 | 42 |
| 1 | Bar | 3 | 10 |
| 2 | Foo | 2 | NULL |
| 2 | Bar | NULL | 9 |
+---------+------+---------+--------+
我尝试了什么:
SELECT project,name,(CASE platform WHEN 'desktop' THEN value END) AS "desktop",(CASE platform WHEN 'mobile' THEN value END) AS "mobile"
FROM test
GROUP BY name,project
ORDER BY project,value ASC
+---------+------+---------+--------+
| project | name | desktop | mobile |
+---------+------+---------+--------+
| 1 | Foo | 1 | NULL |
| 1 | Bar | 3 | NULL |
| 2 | Foo | 2 | NULL |
| 2 | Bar | NULL | 9 |
+---------+------+---------+--------+
SELECT project,NAME,MAX(desktop) AS desktop,MAX(mobile) AS mobile FROM (
SELECT project,(CASE platform WHEN 'desktop' THEN VALUE END) AS "desktop",(CASE platform WHEN 'mobile' THEN VALUE END) AS "mobile"
FROM test
) AS aa
GROUP BY aa.NAME,aa.project
ORDER BY aa.project
说明:
首先,您可以选择(aa)所有数据,根据平台内容扩展价值.
然后使用该选择作为分组数据的原点.
结果:
project name desktop mobile
1 Foo 1 42
1 Bar 3 10
2 Foo 2 NULL
2 Bar NULL 9
Pandas / Python:根据另一列中的值设置一列的值
我需要基于Pandas数据框中的另一列的值来设置一列的值。这是逻辑:
if df['c1'] == 'Value':
df['c2'] = 10
else:
df['c2'] = df['c3']
我无法做到这一点,我想要做的就是简单地创建一个具有新值的列(或更改现有列的值:任何一个都对我有用)。
如果我尝试运行上面的代码,或者将其编写为函数并使用apply方法,则会得到以下信息:
ValueError: The truth value of a Series is ambiguous. Use a.empty,a.bool(),a.item(),a.any() or a.all().
pandas 数据框中 2 列的值计数
如何解决pandas 数据框中 2 列的值计数?
我有一张以下格式的表格。我想做两列(年份和操作)的值计数并获得它们的百分比。 例如,在“2014”年,值“是”出现了 3 次中的 2 次,因此 2/3 = 0.66。我尝试使用 value_counts 但它没有产生以下结果。 任何线索将不胜感激。
var x = [6,4,3]; //pre-defined values
var n = 24; //the number I want to add too
function myFunc(values,goal) {
//code for algorithm
//return a sequence of numbers from the list that add to 24
}
myFunc(x,n)
解决方法
让我们尝试使用 SeriesGroupBy.value_counts
并设置 normalize=True
以获取百分比值:
out = df.groupby(''year'')[''operation''].value_counts(normalize=True)
out
:
year operation
2014 yes 0.666667
no 0.333333
2015 yes 0.666667
0.333333
Name: operation,dtype: float64
还可以将 sort=False
设置为不按每级 0 的最高值排序:
out = df.groupby(''year'')[''operation''].value_counts(normalize=True,sort=False)
out
:
year operation
2014 no 0.333333
yes 0.666667
2015 0.333333
yes 0.666667
Name: operation,dtype: float64
Series.reset_index
可以与 name=
一起使用以创建 DataFrame 而不是 Series 并为未命名的值列命名:
new_df = (
df.groupby(''year'')[''operation''].value_counts(normalize=True)
.reset_index(name=''freq'')
)
year operation freq
0 2014 yes 0.666667
1 2014 no 0.333333
2 2015 yes 0.666667
3 2015 0.333333
使用的数据帧:
df = pd.DataFrame({''year'': [2014,2014,2015,2015],''operation'': [''yes'',''yes'',''no'','''',''yes'']})
关于Pandas:根据特定列的值计数选择行和pandas 根据某列的值筛选的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于linux 中实现根据特定列的重复项提取数据、MYSQL根据特定列选择多个列、Pandas / Python:根据另一列中的值设置一列的值、pandas 数据框中 2 列的值计数的相关知识,请在本站寻找。
本文标签: