我正在尝试合并两个数据帧,并用右df替换左df中的nan,我可以用以下三行代码来做到这一点,但是我想知道是否有更好/更短的方法?
# Example data (my actual df is ~500k rows x 11 cols)
df1 = pd.DataFrame({'a': [1,2,3,4], 'b': [0,1,np.nan, 1], 'e': ['a', 1, 2,'b']})
df2 = pd.DataFrame({'a': [1,2,3,4], 'b': [np.nan, 1, 0, 1]})
# Merge the dataframes...
df = df1.merge(df2, on='a', how='left')
# Fillna in 'b' column of left df with right df...
df['b'] = df['b_x'].fillna(df['b_y'])
# Drop the columns no longer needed
df = df.drop(['b_x', 'b_y'], axis=1)
Run Code Online (Sandbox Code Playgroud) 我的数据框是一长串 4 个字母'A', 'T', 'G','C',我需要按索引计算每个字母的频率
df = pd.DataFrame({'cases': ['ACCTTGTAGTGTATTTTATGACCAAATGACTTTTTCCCCCCAGTGGCTAATTTGTCTCAGGCCTGCGTCTTAAAGAGACACGGTAATGAGTAGGAAGTCCAGCGTGGTCTGGA','ACCTTGTACTGTATCTTATGACCAGATGACTTTTTCCACCCAGTGGCTAATTTGTCTCAGGCCTCCGTCTTAAAGAGACACGGTAATGAGTAGGAAGTCCAACGTGGTCTAGA','GCCTTGTACTGTATATTATGACCAAATGACTTTTTCCACCCATTGGCTAATTTGTCTCAGGCCTCCGTCTTAAAGAGACACGGAAATGAGTAGGAAGTCCAGCGTGGTCTAGA','ACCTTGTACTGTATATTATGACCAGATGACTTTTTCCACCCAGTGGCTAATTTGTCTCAGGCCTCCGTCTTAAAGAGACACGGTAATGAGTAGGAAGTCCAGCGTGGTCTAGA']})
Run Code Online (Sandbox Code Playgroud)
cases
0 ACCTTGTAGTGTATTTTATGACCAAATGACTTTTTCCCCCCAGTGG...
1 ACCTTGTACTGTATCTTATGACCAGATGACTTTTTCCACCCAGTGG...
2 GCCTTGTACTGTATATTATGACCAAATGACTTTTTCCACCCATTGG...
3 ACCTTGTACTGTATATTATGACCAGATGACTTTTTCCACCCAGTGG...
4 ACCTTGTACTGTATATTATGACCAGATGACTTTTTCCACCCAGTGG...
5 ACCTTGTAGTGTATTTTATGACCAAATGACTTTTTCCCCCCAGTGG...
6 ACCTTGTACTGTATCTTATGACCAGATGACTTTTTCCACCCAGTGG...
7 GCCTTGTACTGTATATTATGACCAAATGACTTTTTCCACCCATTGG...
8 ACCTTGTACTGTATATTATGACCAGATGACTTTTTCCACCCAGTGG...
9 ACCTTGTACTGTATATTATGACCAGATGACTTTTTCCACCCAGTGG...
Run Code Online (Sandbox Code Playgroud)
结果将是一个新的 df 形状4x113,我想不出一个熊猫的方法来做到这一点。以下是我的非熊猫解决方案
def freq_lists(dna_list):
n = len(dna_list[0])
A = [0]*n
T = [0]*n
G = [0]*n
C = [0]*n
for dna in dna_list:
for index, base in enumerate(dna):
if base == 'A':
A[index] += 1
elif base == 'C':
C[index] += 1
elif base == …Run Code Online (Sandbox Code Playgroud) 我有这个数据框
temp = pd.DataFrame({'Person': ['P1', 'P2'], 'Dictionary': [{'value1': 0.31, 'value2': 0.304}, {'value2': 0.324}]})
Person Dictionary
0 P1 {'value1': 0.31, 'value2': 0.304}
1 P2 {'value2': 0.324}
Run Code Online (Sandbox Code Playgroud)
我想要这种格式的输出:
temp1 = pd.DataFrame({'Person': ['P1', 'P1', 'P2'], 'Values_Number': ['value1', 'value2', 'value2'], 'Values': [0.31, 0.304, 0.324]})
Run Code Online (Sandbox Code Playgroud)
我尝试使用这个:
temp['Dictionary'].apply(pd.Series).T.reset_index()
Run Code Online (Sandbox Code Playgroud)
Person Values_Number Values
0 P1 value1 0.310
1 P1 value2 0.304
2 P2 value2 0.324
Run Code Online (Sandbox Code Playgroud)
但我无法将其与之前的数据框连接起来。此外,我们也会有犯错误的机会。
我有这个数据框,我需要根据framecol旋转或重塑
df = {'frame': {0: 0, 1: 1, 2: 2, 3: 0, 4: 1, 5: 2}, 'pvol': {0: nan, 1: nan, 2: nan, 3: 23.1, 4: 24.3, 5: 25.6}, 'vvol': {0: 109.8, 1: 140.5, 2: 160.4, 3: nan, 4: nan, 5: nan}, 'area': {0: 120, 1: 130, 2: 140, 3: 110, 4: 110, 5: 112}, 'label': {0: 'v', 1: 'v', 2: 'v', 3: 'p', 4: 'p', 5: 'p'}}
当前数据框
frame pvol vvol area label
0 NaN 109.8 120 …Run Code Online (Sandbox Code Playgroud) 我目前有这个df,其中rect列是所有字符串.我需要将x,y,w和h从中提取到单独的列中.数据集非常大,所以我需要一种有效的方法
df['rect'].head()
0 <Rect (120,168),260 by 120>
1 <Rect (120,168),260 by 120>
2 <Rect (120,168),260 by 120>
3 <Rect (120,168),260 by 120>
4 <Rect (120,168),260 by 120>
Run Code Online (Sandbox Code Playgroud)
到目前为止,这个解决方案有效,但是你可以看到它非常混乱
df[['x', 'y', 'w', 'h']] = df['rect'].str.replace('<Rect \(', '').str.replace('\),', ',').str.replace(' by ', ',').str.replace('>', '').str.split(',', n=3, expand=True)
Run Code Online (Sandbox Code Playgroud)
有没有更好的办法?可能是正则表达式方法
我的数据框df看起来像这样
Year Frequency
1 1975 86
2 1976 52
3 1977 53
4 1978 54
5 1979 301
6 1980 161
Run Code Online (Sandbox Code Playgroud)
您可以使用它自己重现 data.frame:
Year Frequency
1 1975 86
2 1976 52
3 1977 53
4 1978 54
5 1979 301
6 1980 161
Run Code Online (Sandbox Code Playgroud)
我用以下方法绘制了这个图表
ggplot(ydf, aes(x = Year, y = Frequency, fill=Frequency)) + geom_bar(stat = "identity") + geom_text(aes(label = Frequency), nudge_y=1, check_overlap=TRUE)+ scale_x_discrete(guide = guide_axis(angle = 90))
然而,正如您所看到的,条形上方的频率重叠。我尝试将 x 轴移开或像 xlabel 一样将频率旋转 90 度。我已经做了很多谷歌搜索,但没有运气。我对 R 还很陌生,所以我的绘图代码可能不正确或者可以做得更好。请注意,我喜欢图例显示为一个栏的方式,并且不想更改它。
我见过很多类似的问题,但似乎没有一个适合我的情况。我很确定这只是一个 groupby 转换,但我一直在KeyError解决axis问题。我正在尝试 groupbyfilename并检查 count where pred != gt。
例如,索引 2 是 so 1 的唯一索引f1.wav,索引 (13,14,18) 是f2.wavso 3 的唯一索引。
df = pd.DataFrame([{'pred': 0, 'gt': 0, 'filename': 'f1.wav'}, {'pred': 0, 'gt': 0, 'filename': 'f1.wav'}, {'pred': 2, 'gt': 0, 'filename': 'f1.wav'}, {'pred': 0, 'gt': 0, 'filename': 'f1.wav'}, {'pred': 0, 'gt': 0, 'filename': 'f1.wav'}, {'pred': 0, 'gt': 0, 'filename': 'f1.wav'}, {'pred': 0, 'gt': 0, 'filename': 'f1.wav'}, {'pred': 0, 'gt': 0, 'filename': 'f1.wav'}, …Run Code Online (Sandbox Code Playgroud) 我的数据框
df = pd.DataFrame({'date': ['2018-01-01', '2018-01-02', '2018-01-03', '2018-01-04', '2018-01-05'], 'b': ['a', 'a', 'b', 'b', 'c'], 'c': [1,2,3,4,5]})
date b c
0 2018-01-01 a 1
1 2018-01-02 a 2
2 2018-01-03 b 3
3 2018-01-04 b 4
4 2018-01-05 c 5
Run Code Online (Sandbox Code Playgroud)
我想绘制一个折线图,其中 X 是date,y 是c并且线的颜色基于b. 对于此示例,应该有 3 种不同的颜色,只要它们不同,实际颜色就无关紧要。
我虽然这会起作用,但它不允许按列更改颜色。
输出应该是一个行会改变颜色